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

資訊專欄INFORMATION COLUMN

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

Vixb / 1583人閱讀

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

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

問題如下:

現(xiàn)有基類A,A的構(gòu)造函數(shù)中輸出“A Instance”,A中有一靜態(tài)塊內(nèi)輸出“A init”,A的一個派生類B的構(gòu)造函數(shù)中輸出“B instance”, B類中的靜態(tài)塊中輸出“B init”。問:A a = new B(); 輸出結(jié)果及正確的順序?
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]; 這是什么也不會輸出的。

總結(jié)一些其他的情況:

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”. 
        * 對于靜態(tài)字段,只有直接定義這個字段的類才會被初始化
        * 因此通過子類引用父類中定義的靜態(tài)字段,只會觸發(fā)父類的初始化不會觸發(fā)子類的初始化   
        */
        System.out.println(SubClass.value);
        
        /*
        * 這里也不會輸出“SubClass init”, 
        * 這里因為雖然在Java源代碼中引用了SubClass類中的常量HELLOWORD, 
        * 但是在編譯階段通過常量傳播優(yōu)化,
        * 已經(jīng)將此常量的值“hellow word”放到了NotInitialization類的常量池中,
        * 以后NotInitialization對常量 SubClass.HELLWORD 的引用實際都被轉(zhuǎn)化為NotInitialization類對自身常量池的引用了
        */
        System.out.println(SubClass.HELLOWORD);
    
    }
}

總結(jié):

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

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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64895.html

相關(guān)文章

  • JAVA面試(45)

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

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

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

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

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

    tracymac7 評論0 收藏0

發(fā)表評論

0條評論

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