1 package Lab5; 2 3 4 class Root{ 5 static{ 6 System.out.println("Root的静态初始化"); 7 } 8 { 9 System.out.println("Root普通初始化代码"); 10 } 11 public Root(){ 12 System.out.println("root 无参数构造方法"); 13 }; 14 } 15 16 class Mid extends Root{ 17 18 static { 19 System.out.println("Mid的静态的初始化代码"); 20 } 21 { 22 System.out.println("Mid的初始化代码");} 23 public Mid(){ 24 System.out.println("mid 的无参构造方法");} 25 public Mid(String msg){ 26 this(); 27 System.out.println("mid的有参的构造方法,其值为"+msg); 28 } 29 } 30 class Leaf extends Mid{ 31 static{ 32 System.out.println("Leaf,静态初始化块"); 33 } 34 { 35 System.out.println("leaf普通初始化块"); 36 } 37 public Leaf(){ 38 39 super("非常疯狂java讲义"); 40 System.out.println("执行leaf 的构造器"); 41 } 42 } 43 public class StaticCode { 44 45 public static void main(String[] args) { 46 new Leaf(); 47 System.out.println("----------------------------------"); 48 new Leaf(); 49 50 } 51 52 }
运行结果:
Root的静态初始化
Mid的静态的初始化代码
Leaf,静态初始化块
Root普通初始化代码
root 无参数构造方法
Mid的初始化代码
mid 的无参构造方法
mid的有参的构造方法,其值为非常疯狂java讲义
leaf普通初始化块
执行leaf 的构造器
----------------------------------
Root普通初始化代码
root 无参数构造方法
Mid的初始化代码
mid 的无参构造方法
mid的有参的构造方法,其值为非常疯狂java讲义
leaf普通初始化块
执行leaf 的构造器
解析:非静态代码块:
①创建对象时:与构造器类似,创建一个Java对象时,不仅会执行该类的初始化块和构造器,而且系统会一直上溯到java.lang.Object 类,先执行java.lang.Object类的初始化块,开始执行java.lang.Objectde 构造器,依此向下执行其父类的初始化块,开始执行其父类的构造器,,,,最后才执行该类的初始化块和构造器。
静态初始化块与类相似,系统将在初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比普通初始化块先执行。
②与普通初始化块类似:系统在类初始化阶段执行静态代码块时,不仅会执行该类的静态初始化块,而且系统会一直上溯到java.lang.Object 类,先执行java.lang.Object类的静态初始化块,依此向下执行其父类的静态初始化块,,,最后在执行该类静态代码块,经过这个过程才完成了该类的初始化过程。
上面的测试代码中:创建了两个对象:创建第一个对象时:系统中没有Leaf 对象,所以要初始化i化leaf类,第二次时:由于第一次生成的Leaf在虚拟机中保存着,因此不需要再对Leaf进行初始化。
---------------------------摘自李刚《疯狂java讲义》