国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

總結一個某東的面試題 --- java類的初始化時機

Vixb / 1587人閱讀

摘要:今天去某東面試一個特基礎特簡單的問題竟然一不小心腦子短路給答錯了,太懊惱了,記下以至警告問題如下現有基類,的構造函數中輸出,中有一靜態塊內輸出,的一個派生類的構造函數中輸出類中的靜態塊中輸出。

今天去某東面試一個特基礎特簡單的問題竟然一不小心腦子短路給答錯了,太懊惱了,記下以至警告:

問題如下:

現有基類A,A的構造函數中輸出“A Instance”,A中有一靜態塊內輸出“A init”,A的一個派生類B的構造函數中輸出“B instance”, B類中的靜態塊中輸出“B init”。問:A a = new B(); 輸出結果及正確的順序?
public class A{
    static{
        System.out.println("A init");
    }
    public A(){
        System.out.println("A Instance");
    }
}

public class B extends A{
    static{
        System.out.println("B init");
    }
    public B(){
        System.out.println("B Instance");
    }
}

如果是這樣呢:A[] sca = new B[10]; 這是什么也不會輸出的。

總結一些其他的情況:

public class SuperClass{
    static{
        System.out.println("SuperClass init");
    }
    
    public static int value = 123;
}
public class SubClass extends SuperClass{
    static{
        System.out.println("SubClass init");
    }
    
    public static final String HELLOWORD = "hellow word";
}

public class NotInitialization{
    public static void main(String[] args){
        
        /**
        * 這里只會輸出“SuperClass init”, 而不會輸出“SubClass init”. 
        * 對于靜態字段,只有直接定義這個字段的類才會被初始化
        * 因此通過子類引用父類中定義的靜態字段,只會觸發父類的初始化不會觸發子類的初始化   
        */
        System.out.println(SubClass.value);
        
        /*
        * 這里也不會輸出“SubClass init”, 
        * 這里因為雖然在Java源代碼中引用了SubClass類中的常量HELLOWORD, 
        * 但是在編譯階段通過常量傳播優化,
        * 已經將此常量的值“hellow word”放到了NotInitialization類的常量池中,
        * 以后NotInitialization對常量 SubClass.HELLWORD 的引用實際都被轉化為NotInitialization類對自身常量池的引用了
        */
        System.out.println(SubClass.HELLOWORD);
    
    }
}

總結:

對于類的初始化虛擬機規范中明確指出有且只有一下五中情況會立即執行對類的初始化:
1、遇到 new、getstatic、putstatic或invokestatic 著四條指令時,這四條指令分別代表:
    使用new關鍵字實例化對象、讀取或設置靜態字段、調用一個類的靜態方法。
    
2、使用jav.lang.reflect包中的方法對類進行反射調用。

3、當初始化一個類的時候,如果該類的父類沒有初始化,則需要先初始化起父類

4、當虛擬機啟動時,用戶需要指定一個要執行的主類(包括main()方法的那個類),虛擬機會先初始化這個主類

5、使用jdk1.7的動態語言支持時,如果一個java.lang.MethodHandle實例最后的解析結果是:REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,且這個方法句柄所對應的類沒有初始化則需要先觸發其初始化

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64895.html

相關文章

  • JAVA面試(45)

    摘要:本文首發于的博客轉載請注明出處與的區別作用對象是類的靜態方法,作用于當前線程是類的成員方法,作用于對象本身作用調用方法,線程進入休眠狀態調用方法,線程進入阻塞狀態鎖的釋放不會釋放持有的鎖會釋放鎖喚醒自然喚醒或者顯式調用方法調用或者方法調用不 ????本文首發于cartoon的博客????轉載請注明出處:https://cartoonyu.github.io/c... java sl...

    Allen 評論0 收藏0
  • 類的加載機制,雙親委派模型,搞定大廠高頻面試

    摘要:驗證驗證是連接階段的第一步,這一階段的目的是為了確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。字節碼驗證通過數據流和控制流分析,確定程序語義是合法的符合邏輯的。 看過這篇文章,大廠面試你「雙親委派模型」,硬氣的說一句,你怕啥? 讀該文章姿勢 打開手頭的 IDE,按照文章內容及思路進行代碼跟蹤與思考 手頭沒有 IDE,先收藏,回頭看 (萬一哪次面試問...

    Object 評論0 收藏0
  • 金三銀四,2019大廠Android高級工程師面試整理

    摘要:原文地址游客前言金三銀四,很多同學心里大概都準備著年后找工作或者跳槽。最近有很多同學都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數據結構為主,有一些中小型公司也會問到混合開發的知識,至于我為什么傾向于混合開發,我的一句話就是走上編程之路,將來你要學不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...

    tracymac7 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<