Java Object 构造方法的执行顺序

Java Object 构造方法的执行顺序

@author ixenos 

 

 

 

为了使用类而做的准备工作包括三个步骤


1)加载类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象

2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用

3)初始化:若该类有超类,对其初始化,执行静态初始化器静态初始化块

 

类初始化时构造方法执行顺序


对于某一个子类时:

 (1)初始化对象的存储空间为零或null值;(子父类链接完毕,父类初始化完毕后)

 (2)调用父类构造函数无显式调用super(...)时,默认隐式调用super(),否则调用super(...)

 (3)按顺序分别调用类成员变量(例如static int)和实例成员变量(例如int)的初始化表达式;

 (4)调用本身构造函数

 1 public class Dollar extends Money{
 2      Rmb r=new Rmb();
 3     
 4      public Dollar(){
 5       
 6       System.out.println("Dollar is construct!");
 7     
 8      }
 9      public static void main(String[] args){
10       
11       new Dollar();
12       
13      }
14 }
15 class Money{
16  public Money(){
17   System.out.println("Money is construct");
18  }
19 }
20 class Rmb{
21  public Rmb(){
22   System.out.println("RMB is construct");
23  }
24 }
25 
26 
27 /*
28 输出结果:
29 Money is construct
30 RMB is construct
31 Dollar is construct!
32 */

 

 

实例化某一个类的对象的时,块和构造器的相对运行顺序


 (1)父类静态块

 (2)子类静态块

 (3)父类块

 (4)父类构造器

 (5)子类块

 (6)子类构造器 

 

 1 public class Dog {   
 2    public Dog() {   
 3      System.out.println("Dog");   
 4     }   
 5     static{   //静态块
 6         System.out.println("super static block");   
 7     }       
 8   {  //普通块
 9         System.out.println("super block");   
10     }   
11 }  
12  public class Mastiff extends Dog {   
13     public Mastiff() {   
14         System.out.println("Mastiff");   
15     }   
16      {   
17         System.out.println("block");   
18        }   
19    static {   
20       System.out.println("static block");   
21  }   
22   public static void  main(String[] args){   
23       Mastiff mastiff=new Mastiff();         //实例化一个对象
24     }   
25 } 
26 
27 
28 /*
29 输出结果:
30 super static block
31 static block
32 super block
33 Dog
34 block
35 Mastiff
36 */

 

部分参考http://blog.sina.com.cn/s/blog_6caeccff0100q5wz.html

posted @ 2016-08-27 01:08  ixenos  阅读(1576)  评论(0编辑  收藏  举报