Java中类初始化代码块和父类构造器执行顺序问题, 财富值15

2016-10-18 10:52发布

麻烦先看代码

主要内容是关于静态初始化和构造器的执行顺序的问题

class Root {     static     {         System.out.println("Root的静态初始化代码块");     }     {         System.out.println("Root的普通初始化代码块");     }     public Root()     {         System.out.println("Root的无参数的构造器");      } }  class Mid extends Root{     static     {         System.out.println("Mid的静态初始化代码块");      }     {         System.out.println("Mid的普通初始化代码块");     }     public Mid()     {         System.out.println("Mid的无参数构造器");     }      public Mid(String msg)     {         //通过this调用同一类中的重载构造器         //this();         System.out.println("Mid的带参数构造器,其参数值为:" +                 msg );     } }  class Leaf extends Mid {     static     {         System.out.println("Leaf的静态初始化代码块");     }      {         System.out.println("Leaf的普通初始化代码块");     }      public Leaf()     {         //通过super调用父类中有一个字符串参数的构造器         super("急速测试");         System.out.println("执行Leaf的构造器");     } } public class Test {     public static void main(String [] args)     {         System.out.println("test");         new Leaf();         new Leaf();     } } 

代码输出如下

test Root的静态初始化代码块 Mid的静态初始化代码块 Leaf的静态初始化代码块 Root的普通初始化代码块 Root的无参数的构造器 Mid的普通初始化代码块 Mid的带参数构造器,其参数值为:急速测试 Leaf的普通初始化代码块 执行Leaf的构造器 Root的普通初始化代码块 Root的无参数的构造器 Mid的普通初始化代码块 Mid的带参数构造器,其参数值为:急速测试 Leaf的普通初始化代码块 执行Leaf的构造器

问题

  • 我粗略了解载入Leaf类的时候,会先创建父类(直至java.lang.Object)的初始化代码和构造器,那么
    他们的顺序是否如下:

Root类静态初始化代码块 -->Mid类静态初始化代码块 -->Leaf类静态初始化代码块 -->Root类普通初始化代码块 -->Root类构造器 -->... -->Leaf类Root类普通初始化代码块 -->Leaf类的构造器
  • 如果Leaf类的构造器的执行顺序在父类的构造器之后,那么为什么Mid类的有参数构造器已经被传入参数急速测试呢?

可能描述得不是很清楚,如果有疑问请指出来,我会尽量描述清楚的

感谢您抽空查看

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答

具体你自己分析。

首先,使用javac命令编译java类后,该java类的初始化代码块会消失——初始化代码块中的代码会被“还原”到每个构造器中,且位于构造器所有代码前面。

基本流程: