1

言語仕様で単一継承のみが宣言されていることは理解していますが、この 1 つの例がどのようにルールを破っている ように見えるかについては戸惑っています。

クラスを書く場合は、次のようにException書きます。

public class MyException extends Exception {
    //class body
}

ただ、ここを見ると、クラスExceptionが extendsであることがわかりますThrowable

私の考えでは、(理論上のコード例)

 public class MyException extends Throwable, Exception {
    //class body
 }

なぜそうではないのですか?

これは、すべてのクラスが拡張されるのと同じ方法で行われると思いますが、Object一度サブクラス化することもできますか?

4

5 に答える 5

5

階層には複数のレベルが存在する可能性があります。クラスは、それ自体が別のクラスを拡張する(またはインターフェースを実装する)クラスを拡張する場合があります。これは、(理論上または実際には)1つのクラスが2つのクラス自体を拡張することと同じではありません。

Javaのインターフェースは、他の言語の多重継承とほとんど同じ機能を提供します(クラスは複数のインターフェースを実装できるため)が、ここに表示されているものではありません。これは、複数の祖先クラスを持つ標準の単一継承です。

すべての子供がちょうど1人の親を持っている(生物学的に奇妙な)家系図を描くのに役立つかもしれません。これらの子には祖父母がいる場合もありますが、構造のどのレベルでも複数のノードが存在することはありません。

あなたはこのような構造を想像しています:

A   B
 \ /
  C

しかし、実際には次のようになります。

A
|
B
|
C

最も明らかな違いは、変更が最初のグラフのAインスタンスに影響を与えないが、2番目のグラフには影響を与えることです。BB

于 2012-07-06T16:42:45.297 に答える
0

したがって、あなたの例MyExceptionでは、であることThrowableに加えてもExceptionです。したがって、階層は次のようになります。

Throwable -> Exception -> MyException

したがって、階層が実際には次のようになっているとしましょう。

Throwable -> MyException  
Exception -> MyException

それはまだ真実ですが、それはとのMyException両方です。多重継承がもたらすものについての説明については、ここを見てください: ThrowableException

「多重継承を伴うオブジェクト指向プログラミング言語では、菱形継承問題(「死の致命的なダイヤモンド」1と呼ばれることもあります)は、2つのクラスBとCがAから継承し、クラスDが両方のBから継承するときに発生するあいまいさです。およびC.DがAで定義されたメソッドを呼び出し(そしてメソッドをオーバーライドしない)、BとCがそのメソッドを異なる方法でオーバーライドした場合、どのクラスから継承しますか:BまたはC?」

于 2012-07-06T16:50:04.690 に答える
0

クラスは、別のクラスを拡張できる1つのクラスを拡張できます。ただし、1つのクラスが2つのクラスを継承することはできません。あいまいさを引き起こします。そのため、Javaは多重継承をサポートしていません

MyException拡張Throwableを拡張している例外。それが継承の連鎖です。あいまいさは発生しません。

于 2012-07-06T16:52:02.593 に答える
0

これは、すべてのクラスがオブジェクトを拡張するのと同じ方法で行われると思いますが、一度サブクラス化することもできますか?

そうではありません。次のように考えてください。

class A { }

と考えることができます

class A extends Object { }

しかし

class A extends B { }

と考えるべきです

class B extends Object { }
class A extends B { }

ではない

class A extends B, Object { }

Objectクラスの継承階層 (インターフェースの実装は数えません) では、ツリーのルートを除いて、各クラスは単一の親を持つことができます。

于 2012-07-06T16:46:09.010 に答える
0

継承の連鎖です

オブジェクト -> スロー可能 -> 例外 -> MyException

ここを参照してくださいhttp://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

于 2012-07-06T16:46:53.127 に答える