不含继承关系的执行顺序
静态变量 > 静态代码块 > main()方法 > 构造代码块 > 构造方法
public class Son {private static final String name = "Son AAA";static {System.out.println("static property: AAA" + name);System.out.println("son static block");}{System.out.println("son construct block");}public Son(String name) {System.out.println("son construct method");}
}
执行结果:
static property: AAASon AAA
son static block
son construct block
son construct method
原因:
静态代码块在类的加载时候执行,由于类只加载一次,所以静态代码块只执行一次;
(静态代码块里面可能会使用静态变量、因此静态变量先于静态代码块的加载)
加载完成后执行main方法;
创建对象时才会执行构造代码块、构造方法(需要被调用,不创建对象不会执行)。
注意:构造代码块在对象一建立就运行,优于构造函数执行。
构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象(某个)初始化。
为什么构造代码块优于构造函数执行 ?
首先要理解构造代码块的作用,是给所有对象进行统一初始化,提高代码的复用率。
比如有一个Student对象,学生统一年龄是10岁,但是这个班有个插班生,年龄是11岁。这时,可以在构造代码块中默认给年龄是10,在创建“插班生”对象时候单独赋值即可。
含有继承关系的加载顺序
父类静态变量 > 父类静态代码块 > 子类静态变量 > 子类静态代码块 > 父类构造代码块 > 父类构造方法 > 子类构造代码块 > 子类构造方法。
public class Parent {private static final String name = "PARENT name";static {System.out.println("parent name " + name);System.out.println("parent static block");}{System.out.println("parent construct block");}public Parent(String name) {System.out.println("parent construct method");}}
public class Son extends Parent {private static final String name = "Son AAA";static {System.out.println("static property: AAA" + name);System.out.println("son static block");}{System.out.println("son construct block");}public Son(String name) {super(name);System.out.println("son construct method");}
}
parent name PARENT name
parent static block
static property: AAASon AAA
son static block
parent construct block
parent construct method
son construct block
son construct method