猿问

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

麻烦先看代码

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


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的构造器

问题1

(此问题已经解决,谢谢)


我粗略了解载入Leaf类的时候,会先创建父类(直至java.lang.Object)的初始化代码和构造器,那么

他们的顺序是否如下:


Root类静态初始化代码块

-->Mid类静态初始化代码块

-->Leaf类静态初始化代码块

-->Root类普通初始化代码块

-->Root类构造器

-->...

-->Leaf类Root类普通初始化代码块

-->Leaf类的构造器

问题2

如果Leaf类的构造器的执行顺序在父类的构造器之后,那么为什么Mid类的有参数构造器已经被传入参数急速测试呢?


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


感谢您抽空查看


qq_遁去的一_1
浏览 569回答 2
2回答

慕妹3146593

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

相关分类

Java
我要回答