2

Javaの継承に混乱があります。私が研究したように、Javaは多重継承をサポートしていません。継承の菱形継承問題が全くないように。

ただし、JavaのすべてのクラスはデフォルトでObjectクラスを継承します。クラスを拡張すると、2つの継承されたクラスがあります。最初はObjectで、2番目は継承されたクラスです。私が知っているように、クラスが2つ以上のクラスを継承するかどうかは、多重継承として知られています。これは、Javaが2つのクラスを同時に継承するため、多重継承をサポートしていることを示しています。

では、なぜJavaは多重継承をサポートしておらず、Javaで菱形継承問題が発生する可能性があると言われているのでしょうか。

4

9 に答える 9

6

すべてのクラスが extends であるため、拡張しよObjectうとしている基本クラスは、定義上、すでにextends していますObjectObjectクラスはすでに階層に存在するため、クラスを追加する必要はありません。

つまり、階層内でルートとして一度Objectしか存在しないため、「ダイヤモンド」は存在しません。

于 2012-10-29T07:55:13.180 に答える
6

これを見る

                     OBJECT CLASS
                           |
                           |
                     CLASS A{} //Class A extends class Object
                           |
                           |
                     CLASS B{} //Class B extends class A
                           |
                           |
                     CLASS C{}//Class C extends class B

すべてのクラスは Object クラスから継承されるため、他のクラスから継承する場合には当てはまりません。したがって、オブジェクト クラスは、継承された他のすべてのクラスのスーパー クラスまたはルート クラスになります。

だから問題は何ですか?

于 2012-12-15T06:46:18.560 に答える
5

Class extending Objectの場合のの概念を誤解していInheritanceます。

継承階層の最上位クラスのみがObjectクラスから拡張され、階層内の残りのクラスは直接のスーパー クラスを拡張します。Objectしたがって、これらは のこの階層を介してクラスのすべてのメソッドを持ち、関与inheritanceはありません。multiple inheritance

public class A {  // Extends from `Object` class
}

class B extends A { // Extends from `A`
}

class C extends B { // Extends from `B`
}

diamondしたがって、階層に問題はありません。

于 2012-10-29T07:57:48.267 に答える
5

しかし、Java のすべてのクラスはデフォルトで Object クラスを継承し、クラスを拡張すると、継承されるクラスが 2 つあります。最初は Object で、2 番目は継承されたクラスです。

それは部分的に正しいです。

クラスを明示的に拡張すると、クラスは拡張されませんObject

クラスがあれば

class A
{

}

次に、コンパイラはそれを次のように変更します

class A extends Object
{

}

ただし、クラスを明示的に拡張すると、次のようになります。

class A extends AnotherClass
{

}

コンパイラは何も追加しないため、多重継承はありません。

于 2012-10-29T08:01:45.907 に答える
4
Java supports only syntactical multiple inheritance. Java does not 
supports  implementation of multiple inheritance.

Javaはインターフェースを介した多重継承をサポートしていると言う人もいますが、ここでの説明は正しくありません。

継承 ::

あるクラスオブジェクトから別のクラスオブジェクトへのプロパティの取得:

Class A{}

Class B extends A {}

ここでは、クラスBのオブジェクトがクラスAのプロパティ(メソッド/関数/&データメンバー/クラス変数)を取得しています。

Javaがクラスを使用した多重継承をサポートしない理由:

Class A{}
Class B{}
Class C extends A,B{}

X--クラスAがオブジェクトクラスのオブジェクトを両側AとBから取得しているため、このステートメントはエラーを引き起こします。

すべてのJavaクラスは、デフォルトでオブジェクトクラスのオブジェクトとオブジェクトクラスのオブジェクトを拡張します。ルートオブジェクトは、すべてのクラスのスーパークラスを意味します。

しかし、ここではクラスCに2つのスーパークラスのオブジェクトがあるため、エラーが発生すると、Javaはクラスを使用した多重継承をサポートしません。

Javaはインターフェイスを使用した多重継承をサポートしていますか?

このインターフェースの概念のために、Javaが多重継承をサポートしていると言っている人はごくわずかですが、それは間違っています。

ここに説明があります::

interface A{}
interface B{}
interface C implements A , B{}

(また)

interface A{}
interface B{}

Class C implements A , B{}

ここでは多重継承のように見えますが、継承とは、あるクラスオブジェクトから別のクラスオブジェクトにプロパティを取得することを意味します。

ここでのインターフェースの概念では、プロパティをまったく取得しておらず、実装されていないインターフェースのメソッドをクラスに実装しています。

したがって、継承とインターフェイスはまったく逆です......。

したがって、最後に、Javaは多重継承の構文のみをサポートし、多重継承の実装をサポートしません。

継承は借方のようなものであり、インターフェースは貸方のようなものですが、サーバー側のプログラミングなどの他の概念では、インターフェース自体が重要です。

于 2012-12-14T11:45:55.193 に答える
1

Java では、一度に 1 つの異なるクラスからしか継承できません。その個別のクラスは別のクラスから継承する可能性がありますが、複数の個別のクラスから継承する単一のクラスはありません...

于 2012-10-29T07:57:51.660 に答える
1

拡張元のクラスは、既に Object から拡張されています。新しいクラスから拡張すると、事実上、オブジェクトから直接拡張するのをやめ、代わりに新しい直接の祖先を介して継承します。

したがって、2 つの異なるクラスから拡張しているわけではなく、別のクラス、つまり Object クラスから既に拡張しているクラスから拡張しているということです。

視覚的には、多重継承は次のようになります。

  A  Object
  |   |
    C

しかし、あなたが説明する状況は実際には次のとおりです。

Object
  |
  A
  |
  C
于 2012-10-29T07:58:33.127 に答える
1

多くの親を持つことができますがancestors、親は 1 つだけです。ここで祖先とはObject class、親が拡張しているクラスを意味するところを意味します。

于 2012-10-29T07:59:13.040 に答える
1

継承するクラスを指定することで、デフォルトの extends オブジェクトをオーバーライドします。したがって、継承するクラスを指定しない場合にのみ、クラスはオブジェクトを拡張します。

于 2012-10-29T08:00:38.163 に答える