static标明的变量、方法、代码块都属于类所有,仅在类加载时进行唯一一次初始化。
1.不管静态成员变量声明语句的实际位置在哪,当第一次加载类的时候都会首先对它初始化缺省值(0,false,null)。
2.即使静态成员变量声明中使用了显式初始化语句,第一次加载类的时候也会把它初始化缺省值。
3.对于静态成员变量的显示初始化语句和静态初始化块,按照在中代码出现的先后顺序执行。
当构造类实例时候,会先对实例成员变量初始化缺省值,然后执行初始化块,然后执行构造方法
a.如同1中一样,如果实例成员变量的显式初始化语句,程序仍然是先将该成员变量初始化为缺省值,然后按照代码在类中出现的先后顺序执行初始化或者初始化块。
b.在进入构造方法后,如果构造方法第一句是使用this,调用另一个构造方法的话,则先执行另一个构造方法,然后再执行本构造方法的方法体。
public class Parent {
public void test() {
A = 3;System.out.println("test1方法" + A);}static {
System.out.println("Parent 静态代码块执行");A = 2;}public static int A =1;
public Parent(){System.out.println("Parent构造方法执行");}}
public class Son extends Parent {
public static int B = A;
static {
System.out.println("Son静态代码块执行");
}
public Son() {
System.out.println("Son构造方法执行");
}
}
public class Hello {
public static void main(String[] args) {Parent parent1 = new Parent();Parent parent2 = new Son();Son parent3 = new Son();
}}
1.实例化parent中静态代码块、方法、变量,按照顺序一个一个来,然后才是构造方法。
2.实例化son,父类引用指向子类对象,先执行父类的静态,然后是子类静态,然后父类构造方法,然后是子类构造方法
3.实例化son,执行son中构造方法,因为上面已经执行完静态,静态仅在执行一次。