类初始化顺序

前些日至写代码的时候又碰到一个问题,类似于这样:


image.png

子类调用父类的构造器,传入自身的非静态成员变量,编译器会报错
依稀记得以前整理过,所以又去写了一遍相关的测试,代码如下:

public class Child extends Parent{
    static String flag = "Child:";
    Msg msg = new Msg(flag+"field");
    static Msg msgs = new Msg(flag+"static field");
    static {
        List<Msg> list = Arrays.asList(new Msg(flag+"static area"));
    }
    public Child(){
        System.out.println(flag+"init");
    }
}
public class Parent extends GrantParent{
    static String flag = "Parent:";
    Msg msg = new Msg(flag+"field");
    static Msg msgs = new Msg(flag+"static field");
    static {
        List<Msg> list = Arrays.asList(new Msg(flag+"static area"));
    }
    public Parent(){
        System.out.println(flag+"init");
    }
}
public class GrantParent {
    static String flag = "GrantParent:";
    Msg msg = new Msg(flag+"field");
    static Msg msgs = new Msg(flag+"static field");
    static {
        List<Msg> list = Arrays.asList(new Msg(flag+"static area"));
    }
    public GrantParent(){
        System.out.println(flag+"init");
    }
}
public class Msg {
    public Msg(String str){
        System.out.println(str);
    }
}
 @org.junit.Test
    public void testInit(){
        Child child = new Child();
    }

输出为:

image.png

由此可以总结出,java类初始化的顺序为:
1.由基类到导出类的静态成员变量和静态代码块的初始化执行
2.1执行完后,再由基类到导出类的成员变量和构造器的初始化执行,同级的成员变量早于构造器被初始化

所以开头的问题很容易解释,因为基类的构造器早于导出类的非静态成员的初始化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 当类第一次加载到内存中的时候初始化 父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 子类静态成员和静态...
    王简书2009阅读 1,859评论 0 0
  • 开始记录之前,我想先上一张图片,这是书本上给出的代码示例,不知道大家的第一感觉是什么,反正我第一次看到这段代码的时...
    怡红快绿阅读 2,312评论 0 0
  • 前言 做Java开发将近一年半了,虽然之前系统地学习过Java,但是实践出真知,最近总感觉还有好多知识点没有掌握,...
    pro090701阅读 1,781评论 0 0
  • 1.静态代码块,静态变量,按代码顺序先后执行.2.构造代码块,成员变量,按代码顺序先后执行.3.先执行构造块或成员...
    听说我很强阅读 3,034评论 0 0
  • 1、今天,朋友圈里很多人在祭奠八年前那场地动山摇中逝去的生命。所以,亲爱的,我们要善待自己的生命,让每天都往幸福那...
    长征阅读 1,865评论 0 0