Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念。下面探究一下它的执行顺序与可能的用途。
执行顺序
首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块、非静态初始化块和构造函数,里面都是一句简单的输出。
主类Main里面也如法炮制。
1 class A { 2 static { 3 System.out.println("Static init A."); 4 } 5 6 { 7 System.out.println("Instance init A."); 8 } 9 10 A() { 11 System.out.println("Constructor A."); 12 } 13 } 14 15 class B extends A { 16 static { 17 System.out.println("Static init B."); 18 } 19 20 { 21 System.out.println("Instance init B."); 22 } 23 24 B() { 25 System.out.println("Constructor B."); 26 } 27 } 28 29 class C extends B { 30 31 static { 32 System.out.println("Static init C."); 33 } 34 35 { 36 System.out.println("Instance init C."); 37 } 38 39 C() { 40 System.out.println("Constructor C."); 41 } 42 } 43 44 public class Main { 45 46 static { 47 System.out.println("Static init Main."); 48 } 49 50 { 51 System.out.println("Instance init Main."); 52 } 53 54 public Main() { 55 System.out.println("Constructor Main."); 56 } 57 58 public static void main(String[] args) { 59 C c = new C(); 60 //B b = new B(); 61 } 62 }