继承与初始化顺序问题

2019-08-29  本文已影响0人  Hope_加贝
import static net.mindview.util.Print.*;
class Insert{
    private int i = printInit(" Insert.i initialized");;
    protected int j;
    Insert(){
        print("i = "+i+", j ="+j);
        j = 39;
    }
    private static int x1 = printInit("Static Insert.x1 initialized");
    static int printInit(String s){
        print(s);
        return 47;
    }
}

public class  Beetle extends Insert{
    private int k = printInit("Beetle.k initialized");
    public Beetle(){
        print("k = "+k);
        print("j="+j);
    }
    private int h = printInit("Beetle.h initialized");
    private static int x2 = printInit("Static Beetle.x2 initialized");
    public static void main(String[] args){
        print("Beetle constructor");
        Beetle b = new Beetle();
        
    }
    
}

在Beetle上运行Java时,第一件事就是试图访问Beetle.main()(一个static方法),于是加载器开始启动并找出Beetle类的编译代码(在名为Beetle.calss的文件之中),对它进行加载的过程中,编译器注意到它有一个基类
于是它继续进行加载,不管你是否打算产生一个该基类的对象,这都要发生。
如果该基类还有自身的基类,那么仍会递归加载,根基类中的static初始化即会被执行,然后是下一个导出类,因为导出类的static初始化可能会依赖于基类成员能否被正确初始化。

至此,必要的类已加载完毕,对象就可以被创建了,首先,对象中的所有基本类型都会被设为默认值,对象引用被设为null,然后基类的构造器会被调用。
输出结果:

Static Insert.x1 initialized
Static Beetle.x2 initialized
Beetle constructor
 Insert.i initialized
i = 47, j =0
Beetle.k initialized
Beetle.h initialized
k = 47
上一篇下一篇

猜你喜欢

热点阅读