// 檔名:Beetle.java
// The full process of initialization.
class Insect {
int i = 9;
int j;
Insect() {
prt("i = " + i + ", j = " + j);
j = 39;
} static int x1 = prt("static Insect.x1 initialized");
static int prt(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
int k = prt("Beetle.k initialized");
Beetle() {
prt("k = " + k);
prt("j = " + j);
} static int x2 = prt("static Beetle.x2 initialized");
public static void main(String[] args) {
prt("Beetle constructor");
Beetle b = new Beetle();
}
}
大家幫我看看,為什麼會出現那個結果?
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
1。子类初始化之前首先要保证父类已经被正确初始化,所以在打印
Beetle.k initialized之前打印i = 9, j = 0,所以在后来j=39(父类构造函数赋值了)2。其次,静态域的初始化将在类的第一次初始化时发生,并仅仅发生一次
static Beetle.x2 initialized //首先执行的static域的初始化执行;这是在类装载的时候执行;类的装载也是先父类后子类,所以是上面这个顺序;
Beetle constructor //然后再执行main方法类的东西;
i = 9, j = 0 //类对象的构造:先构造父类然后再构造子类;先初始化成员变量;如果没有明确初始化则赋值为默认值;如:int为0;所以j=0;然后再执行构造函数的初始化
Beetle.k initialized //子类对象的构造顺序同父类一样,先成员变量;然后构造函数
k = 47
j = 39 //此时j已经在父类中赋值为39了,所以是39不是0
成员变量的初始化是在构造函数执行之前,所以子类的构造函数执行的时候k已经为47了
我現在有些不明白的是: 在初始化靜態成員的時候也是從父類->子類嗎?