注意事项:java
public static void main(String[] args) { final int c = 0; for (int i=0;i<10;i++) { c=i; //错误:没法为最终变量c分配值 } }
public static void main(String[] args) { for (int i=0;i<10;i++) { final int c = 0; //正确:局部变量,每次循环释放掉 } }
选其一:jvm
public class Demo { private final String name = "桑凤娇";//直接赋值 public Demo(){} } public class Demo2 { private final String name ; public Demo2() { name = "桑凤娇";//经过构造方法赋值 } public Demo2(String name) { this.name = name;//经过构造方法赋值 } }
用final修饰的这个类不能有任何子类ide
注意:一个类若是是final修饰的,其中全部的成员方法都没法进行覆盖(由于没有子类)函数
用final修饰的方法不能被覆盖(不能重写:override)this
static修饰的内容(随类的加载而加载,且加载一次;存储于固定的内存区域(静态区),因此直接用类名进行调用;优先于对象存在,因此能够被全部对象共享)spa
修饰成员变量和成员方法,其中被修饰的成员都属于类,而不是单单属于某个对象,使用时用类能够直接调用,而不须要建立对象设计
使用:code
注意:对象
package com.day02; /** * @author SFJ * @date 2019/11/8 * @time 22:19 **/ public class Test1 { private String name="桑凤娇"; static String idCard ="3709211998092033**"; public static void method1() { method2();//错误,静态方法不能够直接访问非静态成员方法 new Test1().method2();//正确,静态方法建立匿名对象访问非静态成员方法 System.out.println(name);//错误,不能够直接访问非静态成员变量 System.out.println(idCard);//正确,能够直接访问静态成员变量 } public void method2() { System.out.println(idCard);//正确,非静态方法能够访问静态变量 method1();//正确,非静态方法能够访问静态方法 } public static void main(String[] args) { Test1 test1 = new Test1(); test1.method2(); } }
静态代码块:继承
主要做用是给类变量进行初始化赋值
package com.day02; /** * @author SFJ * @date 2019/11/8 * @time 22:53 **/ public class Test3 { private int i=0; Test3(int i) {//第一个构造器:有一个int型形参 this.i = i + 1;//此时this表示引用成员变量i,而非函数参数i System.out.println("Int constructor i——this.i: " + i + "——" + this.i); System.out.println("i-1:" + (i - 1) + "this.i+1:" + (this.i + 1)); //从两个输出结果充分证实了i和this.i是不同的! } Test3(String s){ // 第二个构造器:有一个String型形参 System.out.println("String constructor: "+s); } Test3(int i,String s){// 第三个构造器:有一个int型形参和一个String型形参 this(s);//this调用第二个构造器 this.i=i++;//this以引用该类的成员变量 System.out.println("Int constructor: "+i+"/n"+"String constructor: "+s); } public Test3 increment(){//增量 this.i++; return this;//返回的是当前的对象,该对象属于(Test3) } public static void main(String[] args){ Test3 t0=new Test3(21); Test3 t1=new Test3("桑凤娇"); Test3 t2=new Test3(21,"桑凤娇"); System.out.println(t1.increment().increment().increment().i); //t0.increment()返回一个在t0基础上i++的Test3对象, //接着又返回在上面返回的对象基础上i++的Test3对象! } }
package com.day02; /** * @author SFJ * @date 2019/11/8 * @time 23:08 **/ public class Test4 { public static void main(String[] args) { Son s = new Son(3); System.out.println(); //4 } } class Father { int x = 1; Father() { System.out.println("父类无参的构造方法"); } Father(int x) { this.x = x; System.out.println("父类有参的构造方法"); } void speak() { System.out.println("我是父类"); } } class Son extends Father { int y = 1; Son() { System.out.println("子类无参的构造方法"); } Son(int y) { this.y = y+x; System.out.println("子类带参的构造方法"); } void run() { super.speak(); //访问父类的函数 System.out.println("我是子类"); } }