初始化代码块和构造器的执行顺序
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讲义》

浙公网安备 33010602011771号