此處而調用過程方法 我們必須使用try catch塊但 如果我C的對象存儲在只即,C A =新的C(C的 參考變量),那麼嘗試catch塊不是 needed.Can任何人可以告訴我爲什麼 原因?
你需要記住的是,run-time
類型的引用不一定是相同declared
類型。例如:
Number n = new Integer(1);
這聲明電量爲聲明類型java.lang.Number
到參考的特定的類/類型java.lang.Integer
的java.lang.Number
一個子類的一個參考。
有關實際的信息運行時間類型(通常)僅在運行時可用。但編譯器只能在編譯時運行。在編譯時,編譯器(通常)只知道聲明的類型。
由於它通常只知道宣稱的類型,因此它只能用於決定什麼可以編譯,哪些不能。也就是說,javac只能在編譯時根據它所知道的(或者可以推斷出來的)來執行規則。
再回到你的代碼示例:
編譯器看聲明類型的引用(在此情況下,參考a
是B
類型)。基於此,編譯器知道方法B.process()
會引發需要強制執行的檢查異常。
也就是說,無論是
B a=new C();
或
B a=new B();
聲明的是B
類型,其process()
方法拋出檢查異常的a
。但是,如果您具備以下條件:
C a = new C();
屆時,宣佈型爲C
,不B
。由於子類削弱了其繼承方法的先決條件,因此C
可以自由削弱process()
的前提條件。也就是說,它可以聲明C.process()
拋出由B.process
拋出的異常集合的子集(在C.process()的情況下,它是空集。)
這是有點關係的Liskov substitution principle和Design by Contract,與載明下列原則前者(感謝維基百科)(3,4直接關係到你在Java代碼中觀察到的):
的亞型方法的參數
- 逆變。
- 子類型中返回類型的協方差。
- 除了 以外,子類型的方法不應引發新的異常,其中這些異常本身是 超類型的 方法拋出的異常的子類型。
- 先決條件不能在子類型中加強。
- 後代不能在子類型中被削弱。
- 超類型的不變式必須保存在子類型中。
Java編譯器僅僅是試圖執行一些原則,並通過實際的目的,它採用了宣佈類型的引用變量來確定如何予以執行。
格式不錯,你知道.. – Roman 2010-10-27 13:41:03
可能是[Java的重複。在overriden方法中移除throws聲明,但編譯器在調用時需要try/catch blok。](http://stackoverflow.com/questions/9413599/java-removing-throws-declaration-in-overriden-method-yet-compiler- want-a-try-c) – Raedwald 2014-09-16 07:02:57