簡體   English   中英

Java單一繼承和異常/可拋出類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM