码迷,mamicode.com
首页 > 其他好文 > 详细

初始化代码块和构造器的执行顺序

时间:2015-07-14 13:31:31      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

        

 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讲义》

 

初始化代码块和构造器的执行顺序

标签:

原文地址:http://www.cnblogs.com/guoke289/p/4645138.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!