继承与初始化
了解包括继承在内的初始化全过程,对初始化过程中发生的一切有一个全局性的把握是很有益的事情。先思考一下下例的输出结果。
class Insect{
private int i = 9;
protected int j;
public Insect() {
System.out.println("i = " + i + ", j = " + j);
j=39;
}
private static int x1 = printInt("static Inset.x1 initialezed");
static int printInt(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
private int k = printInt("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = printInt("static Beetle.x2 initialized");
public static void main(String[] args) {
Beetle beetle = new Beetle();
}
}
在Beetle上运行main方法时,加载器启动并加载Beetle的编译文件(Beetle.class),加载过程中编译器注意到他有一个基类,于是继续加载基类编译文件,然后开始初始化基类中的static,然后初始化导出类的static,到此必要的类已加载完毕,可以创建对象了。
首先对象中的基本类型都会被设置为默认值,引用设置为null(其实就是将对象内存全置为0)。然后基类的构造器被调用(构造器的执行过程是先初始化成员变量,再调用构造器方法),最后是导出类的构造器被调用。
因此上例的输出结果如下:
static Inset.x1 initialezed
static Beetle.x2 initialized
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39