美文网首页程序员
类初始化顺序

类初始化顺序

作者: justlinzhihe | 来源:发表于2018-01-01 10:31 被阅读0次

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


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执行完后,再由基类到导出类的成员变量和构造器的初始化执行,同级的成员变量早于构造器被初始化

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

相关文章

  • C++对象模型5——对象的构造/析构

    对象的构造/析构顺序 初始化虚基类,按照继承顺序,从左到右,从最深到最浅。 初始化按照继承顺序初始化父类,如果父类...

  • 9道题来理解什么是类的主动引用和被动引用

    剖析类的初始化顺序? 题目: 执行结果: 剖析类的初始化顺序? 先执行父类的方法,再执行子类的

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • [转]Effective C++学习笔记:初始化列表中成员列出的

    类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行;...

  • 类初始化顺序

    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始...

  • 类初始化顺序

    当类第一次加载到内存中的时候初始化 父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 子类静态成员和静态...

  • 类初始化顺序

    前言 做Java开发将近一年半了,虽然之前系统地学习过Java,但是实践出真知,最近总感觉还有好多知识点没有掌握,...

  • 类初始化顺序

    前些日至写代码的时候又碰到一个问题,类似于这样: 子类调用父类的构造器,传入自身的非静态成员变量,编译器会报错依稀...

  • 类初始化顺序

    一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性静态方法块: static...

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

网友评论

    本文标题:类初始化顺序

    本文链接:https://www.haomeiwen.com/subject/guzzgxtx.html