![](/img/trans.png)
[英]Why doesn't Java have setMessage in Exception/Throwable classes?
[英]Java Single Inheritance and Exception/Throwable classes
我知道語言規范僅聲明了單個繼承,但是我對這個示例似乎違反規則感到困惑。
如果我寫一個Exception
類,我會寫:
public class MyException extends Exception {
//class body
}
僅當您在此處查看時 ,您會注意到Exception
類擴展了Throwable
。
所以在我看來,我們有(理論代碼示例)
public class MyException extends Throwable, Exception {
//class body
}
為什么不是這樣?
我想這是通過每個類擴展Object
方式完成的,但也可以將其子類化一次?
層次結構中可以有多個級別。 一個類可以擴展一個類,該類本身可以擴展另一個類(或實現一個接口)。 (從理論上或在實踐上)這與擴展兩個類本身的一個類不同。
Java中的接口確實提供了與其他語言中的多重繼承相同的功能(因為一個類可以實現多個接口),但這不是您在這里看到的。 這是具有多個祖先類的標准單繼承。
這可能有助於描繪一棵(生物學上怪異的)家譜,其中每個孩子都有一個父母。 這些孩子也可能有一個祖父母,但在結構的任何級別上最多只能有一個節點。
您正在想象一個看起來像這樣的結構:
A B
\ /
C
但實際上是這樣的:
A
|
B
|
C
最明顯的區別是,對A
更改不會影響第一個圖形中的B
實例,但是會影響第二個圖形中的B
我想這是通過每個類擴展Object的方式完成的,但也可以將其子類化一次?
不完全的。 這樣想:
class A { }
可以認為是
class A extends Object { }
但
class A extends B { }
應該是
class B extends Object { }
class A extends B { }
並不是
class A extends B, Object { }
在類繼承層次結構中(不計算接口的實現),每個類都可以有一個父Object
,除了Object
是樹的根。
這是一個繼承鏈
對象->可拋出->異常-> MyException
參見此處http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
因此,在您的示例中, MyException
除了是Exception
之外,也是Throwable
。 因此,層次結構如下所示:
Throwable -> Exception -> MyException
因此,可以說該層次結構實際上如下所示:
Throwable -> MyException
Exception -> MyException
雖然仍然正確,但MyException
既是Throwable
也是Exception
。 關於多重繼承帶來的解釋,請看這里 :
“在具有多重繼承的面向對象的編程語言中,菱形問題(有時稱為“致命的死亡鑽石” 1 )是當兩個類B和C從A繼承而D類從兩個B繼承時產生的歧義。如果D調用了A中定義的方法(並且不覆蓋該方法),並且B和C以不同的方式覆蓋了該方法,則它從哪個類繼承:B或C?”
一個類可以擴展一個類,可以擴展另一個類。 但是一個類不能繼承兩個類。 這會引起歧義 。 這就是Java 不支持多重繼承的原因 。
MyException擴展的異常,它擴展了Throwable。 那就是繼承鏈。 這不會引起歧義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.