java靜態代碼塊 類加載順序問題。


class B extends Object { 
static {System.out.println("Load B");}
public B(){
System.out.println("Create B");} }
class A extends B {
static {System.out.println("Load A");}
public A(){
System.out.println("Create A");} }
public class Test {
public static void main(String[] args){ A a = new A();
} }
這是alibaba筆試題,求輸出的順序?
答案為Load B-->Load A-->Create B-->Create A;

原因就是一句話:先有了父親,才會有兒子! 程序運行時,加載AB兩類,因為A是B子類,所以先加載B類,Load B,再加在A類 LoadA,
調用A a = new A()代碼時,會先調用其父類B的構造方法 Create B 再調用A的構造方法 Create A
追問:
先有父親后有兒子,這句話不是只針對“構建對象”而言的嗎,他也針對“類的加載”嗎?我的理解是:對於構建對象的話,
的確是應該先構建父類對象,才能構建子類對象。但對於類的加載的話
,不應該是看到內存中缺少了哪個類就應該加載哪個類的嗎?
追答:
加載的時候也是一樣的,當加載類A的時候,發現有父類B,就去搜索並加載B了,
這個時候還沒有加載A中那些靜態塊,等B加載完了之后,才會返回來加載A,
也只有這樣,程序才知道A中到底會有些什么方法,因為A中存在着由B繼承而來的方法。
如果先加載了A,那么就會出現兩種情況,一種是A中沒有繼承而來的方法,
另一種是加載B后再一次加載A繼承而來的方法,那這樣的Java就太差勁了,你說呢?


可參考:http://blog.csdn.net/qiyeliuli/article/details/54867055(寫的很好)

java之繼承中的構造方法:繼承構造器調用

http://www.cnblogs.com/Gaojiecai/p/4004782.html

 

java 重載、重寫、構造函數詳解

https://www.cnblogs.com/0201zcr/p/4853283.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM