1、static关键字:
static关键字可用于修饰属性,也可用于修饰方法,还可以用于修饰类。
1.1、static成员变量:
使用了static修饰的成员变量,即是静态成员变量。无论一个类生成了多少个对象,所有这些对象共同使用唯一的一静态的成员变量。即是一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随着发生变化。
可以通过 类名.静态成员变量名 来获取静态成员变量。
1.2、static静态方法:
static修饰的方法叫做静态方法,静态方法只能继承不能重写(Override)(可以覆盖,用多态调用时,执行的也是父类的static静态方法)。
可以通过 类名.方法名 的方式来访问。
1.3、static静态代码块:
静态代码块的作用是完成一些初始化工作。
1.4、静态代码块的执行:
首先执行静态代码块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生产对象的时候执行。
调用某个类来生成对象时,首先将类加载到Java虚拟机上,然后有虚拟机加载这个类来生成对象。而静态代码块只会执行一次,是在类被加载的时候执行的。
因为每个类只会被加载一次,所以静态代码块也只会被执行一次。而每生成一个对象都会调用类的构造方法。
如果一个类中既有构造方法,又有静态代码块,那么首先执行顶层类的静态代码块,一直执行到底层类的代码块。在去从顶层到底层执行构造方法。
注意:静态代码块只会被执行一次。
如下面的静态代码块和构造方法的编写:
class A{
static{
System.out.println("static code A");
}
public A(String str){
System.out.println("constructor A:" + str);
}
}
class B extends A{
static{
System.out.println("static code B");
}
public B(){
super("call constructor with parameters");
System.out.println("constructor B");
}
}
B b = new B(); 执行结果为:
static code A static code B constructor A:call constructor with parameters constructor B
1.5、静态访问规则:
不能在静态方法中访问非静态的成员变量,只能访问静态的成员变量。但可以在非静态的方法中访问静态的成员变量。
静态只能访问静态;非静态可以访问一切。
不能在静态方法中使用this关键字。
2、final关键字:
当final关键字修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化。当final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但引用直线对象的内容是可以改变的。
final常量:
当一个属性被final修饰时,表示该属性不能被改写。
对应final类型的成员变量,有两种赋初值的方式: ① 在生命final类型成员变量时就赋初值 ② 在生命final类型成员变量时不赋初值,但在类的所有构造方法中都为其附上初值。
final方法:
final方法是一个终态方法,不能被重写(Override)。