class a
public a()
}class b extends a
public b()
}public class test
}
輸出:abxy xy
執行過程:
a ab = new b();
執行時候第一使用到a、b類,jvm發現沒有載入a、b的資訊,故先載入,由於b繼承了a類,所以會先載入a再載入b,在載入的過程中會執行static塊完成類的初始化。所以會先輸出ab,此時建立b物件時候,會先執行a的構造方法在執行b的構造方法,故在輸出xy,所以最後輸出abxy
當執行:
ab = new b();
時候發現已經載入過a、b的位元組碼了,故不會再載入了,所以不會輸出ab,直接輸出xy即可
如果**修改為:
class a
public a()
}class b extends a
public b()
}public class test
}
輸出還是:
abxy
xy當執行b ab = new b()時候,由於jvm事先就會知道b是繼承至a的,所以需要先載入a,如果不先載入a的話,無法完成子類b的載入!所以類的載入順序和構造器執行順序一致,先父類再子類!
注意:容易糊塗的地方是,以為b ab =new b();以為建立b所以先載入b之後再載入a,這種理解就錯誤了,因為對於物件的建立是從父類開始的!
拓展:非靜態**塊的執行順序也是先父類,在子類!但是非靜態**塊執行順序在靜態**塊之後,構造器之前!靜態**塊只會執行一次(類載入時候執行),而非靜態**塊會多在建立物件時候多次執行!
實踐**:
class a
public a()
}class b extends a
public b()
}public class test
}
輸出:
aba-axb-by
a-axb-by
如果兩個類沒有繼承關係的話,類的載入順序就是按照**的執行順序進行載入的。
class c
public c()
}class d
public d()
}public class test1
}
輸出:cx
dy
一道android筆試題目
面試 了一波,於是痛定思痛改頭換面,不得不說敲 中筆試和用電腦還是有很大區別的.題目大概是這樣的 假設限定輸入使用者輸入電子郵箱位址,使用者名稱必須只包含英文本母,數字和 並且必須以字母和數字開頭,郵件服務網域名稱只包含字母和數字 請使用你所熟悉的程式語言編寫乙個函式,該函式判斷輸入的字串是否為乙個...
一道筆試題
看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...
一道筆試題
上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...