为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_遁去的一_1 2019-03-14 14:15:32
麻烦先看代码主要内容是关于静态初始化和构造器的执行顺序的问题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();    }}代码输出如下testRoot的静态初始化代码块Mid的静态初始化代码块Leaf的静态初始化代码块Root的普通初始化代码块Root的无参数的构造器Mid的普通初始化代码块Mid的带参数构造器,其参数值为:急速测试Leaf的普通初始化代码块执行Leaf的构造器Root的普通初始化代码块Root的无参数的构造器Mid的普通初始化代码块Mid的带参数构造器,其参数值为:急速测试Leaf的普通初始化代码块执行Leaf的构造器问题1(此问题已经解决,谢谢)我粗略了解载入Leaf类的时候,会先创建父类(直至java.lang.Object)的初始化代码和构造器,那么他们的顺序是否如下:Root类静态初始化代码块-->Mid类静态初始化代码块-->Leaf类静态初始化代码块-->Root类普通初始化代码块-->Root类构造器-->...-->Leaf类Root类普通初始化代码块-->Leaf类的构造器问题2如果Leaf类的构造器的执行顺序在父类的构造器之后,那么为什么Mid类的有参数构造器已经被传入参数急速测试呢?可能描述得不是很清楚,如果有疑问请指出来,我会尽量描述清楚的感谢您抽空查看
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

找了半天也没找到block的执行时间,后来使用javap -c查看class文件发现block被扔到构造器里面了,并且invokespecial superclass的<init>方法也在里面,不过在block前面,这就解释了你的问题了。


查看完整回答
反对 回复 2019-04-25
  • 2 回答
  • 0 关注
  • 568 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信