1.初始化
1.1 初始化条件: "initialize on first active use"--" 在首次主动使用时初始化"。
(1). 使用new关键字时 例如 User user = new User()
(2). 初次使用该类的静态成员时 例如 User.name
(3). 使用该类的导出类时
2.初始化顺序
2.1 java初始化顺序
(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
(4) 父类构造函数
(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
(6) 子类构造函数
1 public class Test { 2 public static void main(String[] args) { 3 Sub sub = new Sub(); 4 } 5 } 6 7 class Super { 8 static { 9 System.out.println("Super.static.area"); 10 } 11 12 private int a = 2; 13 private int b = 1; 14 15 Super() { 16 System.out.println("Super() a: " + a); 17 System.out.println("Super() b: " + b); 18 method(); 19 } 20 21 void method() { 22 System.out.println("Super.method"); 23 } 24 } 25 26 class Sub extends Super { 27 static { 28 System.out.println("Sub.static.area"); 29 } 30 31 private int b = 2; 32 33 Sub() { 34 System.out.println("Sub() b: " + b); 35 method(); 36 } 37 38 @Override 39 void method() { 40 System.out.println("b: " + b); 41 } 42 }output: 43 Super.static.area 44 Sub.static.area 45 Super() a: 2 46 Super() b: 1 47 b: 0 48 Sub() b: 2 49 b: 2
3.初始化原理
上面仅仅是初始化的结果,为什么要这要初始化?
先立一个flag在这里,等看了jvm后再写
4.reference
https://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/
https://www.nowcoder.com/test/question/done?tid=8188278&qid=3212#summary