Java中类初始化代码块和父类构造器执行顺序问题,
澳门新葡京
澳门新葡京
当前位置 : 澳门新葡京 > 澳门葡京赌场官网

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 MidString 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 mainString [] 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类的有参数构造器已经被传入参数急速测试呢?

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

感谢您抽空查看

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

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

基本流程:

1.为要创建的对象分配内存空间,其大小取决于Java类及其父类和祖先类包含的所有实例域的数量和类型
2.如果内存分配成功失败会抛出OutOfMemoryError错误,把新创建的对象的所有实例域包括父类的都设为默认值
3.调用构造方法
    ①调用父类的构造方法,如果没有显式使用super关键字进行调用,则由编译器自动生成相关的代码
    ②按照类中实例域的顺序初始化实例域的值
    ③执行类的构造方法中的其他代码完成最终的初始化工作

具体你自己分析。

广告位

澳门新葡京