csnd的這個學生空間還是不錯的,值得關注,剛纔連續複製粘貼了以前的帖子(有一篇是摘抄的,但是原文作者找不到了,慚愧!),正好今天晚上有時間,拿出來幾個問題和大家分享!
第一題:
public class Test {
int a=10;
public Test(){
a=0;
}
public static void main(String args[]){
System.out.println(new Test().a);
}
}
輸出結果是什麼呢?是不是有點模棱兩可啊,呵呵,趕快拿起編譯器自己試試吧!
答案 0
第二題:
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();
}
}
這道題好像是摘抄自<<thinking in java>>一書,具體哪個章節忘記了。
看了頭是不是稍微有點暈呢?呵呵,答案是
static Insect.x1
static Beetle.x2
Beetle constructor
i=9,j=0
beetle.k
k=47
j=39
以下是一些規則(我很久以前寫的,不過如今讀來仍受益匪淺,希望對你也有所幫助!)
一JVM用到某個類時纔會將該類裝載進來,如果該類擁有父類,則會先將該類的父類裝載進來。
二當一個類被JVM裝載,則會初始化static修飾的成員。
三當調用某個類的構造函數時,如果該類擁有父類,則會先調用父類的構造函數。在執行構造函數裏的語
句前,先會初始化該類中非static的成員(static修飾的成員在裝載時已被初始化).
具體分析過程我就不寫了,相信大家已經能自己找到答案了!