例:
class Insect{
int i=9;
int j;
Insect(){
prt("i="+i+",j="+j);
j=39;
}
static int x1=prt("static Insect.x1");
static int prt(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
int k=prt("beetle.k");
Beetle(){
prt("k="+k);
prt("j="+j);
}
static int x2=prt("static Beetle.x2");
public static void main(String[] args){
prt("Beetle constructor");
Beetle b=new Beetle();
}
}
輸出結果:
static Insect.x1
static Beetle.x2
Beetle constructor
i=9,j=0
beetle.k
k=47
j=39
首先要明確三條規則:
一JVM用到某個類時纔會將該類裝載進來,如果該類擁有父類,則會先將該類的父類裝載進來。
二當一個類被JVM裝載,則會初始化static修飾的成員。
三當調用某個類的構造函數時,如果該類擁有父類,則會先調用父類的構造函數。在執行構造函數裏的語
句前,先會初始化該類中非static的成員(static修飾的成員在裝載時已被初始化).
瞭解了以上三點後,對以上輸出結果進行分析:
首先程序的入口是main(),在Beetle這個類中,又由於該類有父類Insect,根據第一,二條規則,首先裝載Insect類,初始化Insect內的靜態成員,輸出static Insect.x1。接着裝載Beetle類,初始化Beetle的靜態成員,輸出static Beetle.x2
這個時候纔開始執行main()中的語句:
prt("Beetle constructor");輸出Beetle constructor。
Beetle b=new Beetle();會調用Beetle的無參構造方法,根據第三條規則,會調用其父類Insect的無參構造方法(),在執行該方法之前,會初始化變量i=9;j=0;接着執行該方法內的語句:
prt("i="+i+",j="+j);輸出i=9,j=0 。這時候j=39.
初始化Beetle內的成員,
int k=prt("beetle.k");輸出:beetle.k。k=47。
最後才執行Beetle構造方法內的語句:
prt("k="+k);輸出k=47
prt("j="+j);輸出j=39