<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

    Java不為人知的10個真相

    你是不是一開始就用Java來編程的呢?還記得當年它還被稱為"Oak",OO還是熱門的話題,C++的用戶覺得Java沒有前景,applets還只是個小玩意,菊花也還是一種花的時候嗎?
      我敢打賭下面至少有一半是你不清楚的。這周我們來看一下跟Java的內(nèi)部實現(xiàn)相關(guān)的一些神奇的事情。
      1. 其實根本沒有受檢查異常這回事
      沒錯!JVM壓根兒就不知道有這個東西,它只存在于Java語言里。
      如今大家都承認受檢查異常就是個錯誤。正如Bruce Eckel最近在布拉格的的GeeCON會議上所說的,除了Java外沒有別的語言會使用受檢查異常這種東西,即使是Java 8的新的Streams API中也不再使用這一異常了(不然當你的lambda表達式中用到IO或者JDBC的話就得痛苦死了)。
      如何能證實JVM確實不知道這個異常?看下下面這段代碼:
    public class Test {
    // No throws clause here
    public static void main(String[] args) {
    doThrow(new SQLException());
    }
    static void doThrow(Exception e) {
    Test.<RuntimeException> doThrow0(e);
    }
    @SuppressWarnings("unchecked")
    static <E extends Exception>
    void doThrow0(Exception e) throws E {
    throw (E) e;
    }
    }
      這不僅能通過編譯,而且也的確會拋出SQLException異常,并且完全不需要用到Lombok的@SneakyThrows注解。
      更進一步的分析可以看下這篇文章,或者Stack Overflow上的這個問題。
      2. 不同的返回類型也可以進行方法重載
      這個應(yīng)該是編譯不了的吧?
      class Test {
      Object x() { return "abc"; }
      String x() { return "123"; }
      }
      是的。Java語言并不允許同一個類中出現(xiàn)兩個重寫等價("override-equivalent")的方法,不管它們的throws子句和返回類型是不是不同的。
      不過等等。看下Java文檔中的 Class.getMethod(String, Class...)是怎么說的。里面寫道:
      盡管Java語言不允許一個類中的多個相同簽名的方法返回不同的類型,但是JVM并不禁止,所以一個類中可能會存在多個相同簽名的方法。這添加了虛擬機的靈活性,可以用來實現(xiàn)許多語言特性。比如說,可以通過bridge方法來實現(xiàn)協(xié)變返回(covariant return,即虛方法可以返回子類而不一定得是基類),bridge方法和被重寫的方法擁有相同的簽名,但卻返回不同的類型。
      哇,這倒有點意思。事實上,下面這段代碼就會觸發(fā)這種情況:
      abstract class Parent<T> {
      abstract T x();
      }
      class Child extends Parent<String> {
      @Override
      String x() { return "abc"; }
      }
      看一下Child類所生成的字節(jié)碼:
    // Method descriptor #15 ()Ljava/lang/String;
    // Stack: 1, Locals: 1
    java.lang.String x();
    0  ldc <String "abc"> [16]
    2  areturn
    Line numbers:
    [pc: 0, line: 7]
    Local variable table:
    [pc: 0, pc: 3] local: this index: 0 type: Child
    // Method descriptor #18 ()Ljava/lang/Object;
    // Stack: 1, Locals: 1
    bridge synthetic java.lang.Object x();
    0  aload_0 [this]
    1  invokevirtual Child.x() : java.lang.String [19]
    4  areturn
    Line numbers:
    [pc: 0, line: 1
      在字節(jié)碼里T其實就是Object而已。這理解起來就容易多了。
      synthetic bridge方法是由編譯器生成的,因為在特定的調(diào)用點Parent.x()簽名的返回類型應(yīng)當是Object類型。如果使用了泛型卻沒有這個bridge方法的話,代碼的二進制形式就無法兼容了。因此,修改JVM以支持這個特性貌似更容易一些(這順便還實現(xiàn)了協(xié)變返回),看起來還挺不錯 的吧?
      你有深入了解過Java語言的規(guī)范和內(nèi)部實現(xiàn)嗎?這里有許多很有意思的東西。

    posted on 2014-12-05 12:16 順其自然EVO 閱讀(205) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2014年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲日韩精品无码专区网站| 亚洲精品国产电影午夜| 人妻无码久久一区二区三区免费| 亚洲最新中文字幕| 免费无码又爽又刺激高潮的视频| 两个人看www免费视频| 亚洲国产成人精品无码一区二区 | 91嫩草国产在线观看免费| 美女黄网站人色视频免费| 99久久亚洲精品无码毛片| 国产老女人精品免费视频| 少妇人妻偷人精品免费视频| 久久久久亚洲精品无码网址色欲 | 久久精品国产亚洲AV无码麻豆| 狠狠久久永久免费观看| 久久成人免费播放网站| 免费的黄网站男人的天堂| 亚洲成年人电影网站| 亚洲亚洲人成综合网络| 在线观看免费污视频| 久久综合国产乱子伦精品免费 | **aaaaa毛片免费同男同女| 窝窝影视午夜看片免费| 亚洲午夜在线播放| 亚洲av日韩av无码| 中文字幕亚洲激情| 青青青国产免费一夜七次郎| 每天更新的免费av片在线观看| 久久久久免费视频| 怡红院亚洲红怡院在线观看| 亚洲六月丁香六月婷婷色伊人 | 亚洲一区二区成人| 在线a亚洲v天堂网2019无码| 日韩免费a级在线观看| 曰批视频免费30分钟成人| 一级毛片免费观看| 最近免费字幕中文大全| 亚洲第一视频在线观看免费| 国产精品亚洲综合| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲欧洲日韩国产一区二区三区 |