多类继承顺序

 1 class Root
 2 {
 3     static{
 4         System.out.println("Root的静态初始化块");
 5     }
 6     {
 7         System.out.println("Root的普通初始化块");
 8     }
 9     public Root()
10     {
11         System.out.println("Root的无参数的构造器");
12     }
13 }
14 class Mid extends Root
15 {
16     static
17     {
18         System.out.println("Mid的静态初始化块");
19     }
20     {
21         System.out.println("Mid的普通初始化块");
22     }
23     public Mid()
24     {
25         System.out.println("Mid的无参数的构造器");
26     }
27     public Mid(String msg)
28     {
29         //通过this调用同一类中重载的构造器
30         this();
31         System.out.println("Mid的带参数构造器,其参数值:" + msg);
32     }
33 }
34 class Leaf extends Mid
35 {
36     static{
37         System.out.println("Leaf的静态初始化块");
38     }
39     {
40         System.out.println("Leaf的普通初始化块");
41     }    
42     public Leaf()
43     {
44         //通过super调用父类中有一个字符串参数的构造器
45         super("Java初始化顺序演示");
46         System.out.println("执行Leaf的构造器");
47     }
48 
49 }
50 
51     public class TestStaticInitializeBlock
52     {
53         public static void main(String[] args) 
54         {
55             new Leaf();
56         }
57     }                            

 

程序源代码以及运行结果截图:

      程序源代码:

 

程序运行结果截图:

 

原因分析:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

具体的执行顺序是:先初始化父类(最高层次的)的静态初始化块,父类的无参构造器,在进行子类的静态初始化块,子类的无参构造器;

然后是父类的普通初始化块,子类的普通初始化块;父类的带参构造器,子类的带参构造器。

super的用法

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”:

静态初始化块的执行顺序:

具体的执行顺序是:先初始化父类(最高层次的)的静态初始化块,父类的无参构造器,在进行子类的静态初始化块,子类的无参构造器;

然后是父类的普通初始化块,子类的普通初始化块;父类的带参构造器,子类的带参构造器。

静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。

 

posted @ 2015-10-16 20:26  码农小正  阅读(661)  评论(0编辑  收藏  举报