Chinaunix首页 | 论坛 | 博客
  • 博客访问: 516004
  • 博文数量: 161
  • 博客积分: 2250
  • 博客等级: 大尉
  • 技术积分: 1601
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-19 18:58
文章分类

全部博文(161)

文章存档

2017年(2)

2015年(44)

2012年(1)

2011年(35)

2010年(10)

2009年(9)

2008年(5)

2007年(55)

我的朋友

分类: Java

2015-02-11 14:42:32

参考http://len-len.iteye.com/blog/1412463

先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。

Java代码  收藏代码
  1. /**父类*/  
  2. package test;  
  3. public class Father {  
  4.     static  
  5.     { System.out.println("父类静态初始化块");}  
  6.     { System.out.println("父类初始化块");      }  
  7.     private static int b = 1;  
  8.     public Father() {  
  9.         System.out.println("调用了父类无参构造器");  
  10.     }  
  11.     public Father(int b) {  
  12.         this.b = b;  
  13.         System.out.println("调用父类的有参构造器");  
  14.     }  
  15. }  
Java代码  收藏代码
  1. /**子类*/  
  2. package test;  
  3. public class Son extends Father {  
  4.     static  
  5.     { System.out.println("子类静态初始化块"); }  
  6.     { System.out.println("子类初始化块");       }  
  7.     private static int a =1;  
  8.     public Son() {  
  9.         System.out.println("调用子类的构造器");  
  10.     }  
  11.     public Son(int a){  
  12.         this.a=a;  
  13.         System.out.println("调用子类的有参构造器");  
  14.     }  
  15. }  

  •    单独的一个对象初始化,不含继承和其他情况

Java代码  收藏代码
  1. package test;  
  2. public class Test {  
  3.   
  4.     public static void main(String[] args) {  
  5.         Father father = new Father();  
  6.     }  
  7. }  

 

    打印的结果为:

    父类静态初始化块

    父类初始化块

    调用了父类无参构造器

 

    我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。

  • 包含继承的子类初始化

下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?

 

Java代码  收藏代码
  1. package test;  
  2. public class Test {  
  3.     public static void main(String[] args) {  
  4.         Son son = new Son();  
  5.     }  
  6. }  
 

   打印语句:

    父类静态初始化块

   子类静态初始化块

   父类初始化块

   调用了父类无参构造器

   子类初始化块

   调用子类的构造器

  打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。

  • 包含继承和多态的子类初始化

  再看如果是多态的情况下会有什么情况出现呢?

 

Java代码  收藏代码
  1. package test;  
  2.   
  3. public class Test {  
  4.   
  5.     public static void main(String[] args) {  
  6.         Father father = new Son();  
  7.     }  
  8. }  

 打印语句:

     父类静态初始化块

     子类静态初始化块

     父类初始化块

     调用了父类无参构造器

     子类初始化块

     调用子类的构造器

和前面继承的情况完全一样,这里不再啰嗦了。

 

总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。

阅读(1042) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~