0

Java 言語は単一継承しかサポートしていないと言われています。しかし、オブジェクトと他のクラスを同時に継承するにはどうすればよいでしょうか? 多重継承じゃないですか。

次に、11 個のオブジェクト メソッドをすべて継承する必要があるのはなぜでしょうか。なぜI / Oでそれらが必要なのか、ほとんど想像できませんでした。

最後に、JDK 8 では、インターフェイスでのデフォルト メソッドの実現が提供されます。これにより、Java で多重継承が発生する可能性があります。

インターフェイス A がデフォルトの実現を持つメソッド a() を提供し、インターフェイス B も別のデフォルトの実現を持つメソッド a() を提供し、カスタム クラス C が両方のインターフェイスを実装し、デフォルトの実現に依存しているとしたら、それはDiamond of Death ではないでしょうか?

4

6 に答える 6

8

しかし、どのようにしてObjectと他のクラスから同時に継承することができますか?それは多重継承ではありません。

いいえ、これは何が起こるかではありません。すべてのクラスがクラスから直接拡張されるわけではありませんObject。ただし、継承階層の最上位にあるクラスのみがObjectclass(暗黙的に)から拡張されます。階層の下位にある残りのクラスは、Objectクラスからスーパークラスまで拡張されます。そして、これは私たちがマルチレベル継承と呼んでいるものです。

したがって、以下の階層を検討してください。

class A { }

class B extends A { }

上記の場合、class Aはと同等class A extends Objectです。

次に、11個のObjectメソッドすべてを継承するために何をする必要がありますか?なぜI/Oで必要なのか想像もつきませんでした

あなたが継承と言うとき、あなたはオーバーライドを意味したのではないかと思います。クラスのメソッドをオーバーライドする必要はありません。メソッドをオーバーライドするかどうかは、要件に応じて決まります。例:-インスタンスのカスタム等価性テストを作成するために、メソッドをオーバーライドすることがよくあります。その場合、とのコントラクトを維持するために、メソッドもオーバーライドする必要があります。Objectequals()hashCode()equals()hashCode()

最後に、JDK 8は、インターフェイスでのデフォルトのメソッド実現を提供します。これにより、Javaで多重継承が発生する可能性があります。

インターフェイスAがデフォルトの実現を備えたメソッドa()を提供し、インターフェイスBが別のデフォルトの実現を備えたa()メソッドも提供し、カスタムクラスCが両方のインターフェイスを実装し、デフォルトの実現に依存している場合はどうなりますか?それはDiamond of Deathではないでしょうか?

このことについてはまだ読んでいないので、この概念についてコメントすることはできません。おそらく、後で答えを更新するでしょう。

于 2013-02-04T17:56:30.137 に答える
3

しかし、オブジェクトと他のクラスを同時に継承するにはどうすればよいでしょうか? 多重継承じゃないですか。

特に指定しない限り、クラスはObject. つまり、これは次のとおりです。

class A { ... }

次と同等です。

class A extends Object { ... }

次に、11 個のオブジェクト メソッドをすべて継承する必要があるのはなぜでしょうか。なぜI / Oでそれらが必要なのか、ほとんど想像できませんでした。

  • equals()hashCode()比較およびハッシュ テーブルで使用されます。
  • notify()wait()クロススレッド通信の低レベルの基礎を形成します。
  • getClass()すべてのリフレクション コードの開始点です。

に配置することObjectで、JVM 内のすべてのオブジェクトで使用できます。任意のオブジェクトのハッシュ コードとクラスを取得したり、任意の2 つのオブジェクト間の同等性をチェックしたり、任意のオブジェクトを監視および通知したりできます。

インターフェイス A がデフォルトの実現を持つメソッド a() を提供し、インターフェイス B も別のデフォルトの実現を持つメソッド a() を提供し、カスタム クラス C が両方のインターフェイスを実装し、デフォルトの実現に依存しているとしたら、それは Diamond of Death ではないでしょうか?

ここSOの別の質問で説明されているように(これは文字通り「jdk8デフォルトメソッド」を1回検索するだけです):

多重継承の問題を解決するには、同じメソッド名とシグネチャのデフォルト実装を提供する 2 つのインターフェースを実装するクラスが、メソッドの実装を提供する必要があります。

したがって、クラスは独自の実装を提供する必要があり、デフォルト メソッドの 1 つに委譲する可能性があります。

于 2013-02-04T18:02:45.667 に答える
1

あなたは「死のダイヤモンド」について正しいですが...

これは、DがインターフェイスCとBを実装し、それらの両方がAを実装する状況です。さらに、これらのインターフェイスの2つ以上で定義されたデフォルトのメソッドがあります。

ここに画像の説明を入力してください

Java 8では、2つのデフォルトのメソッド定義を分類する方法を定義しました。

私が思い出したように、AとBの両方にデフォルトのメソッドが定義されている場合、Dはクラス階層の下位にあるBのバージョンを使用します。

BとCの両方に同じデフォルトのメソッドが定義されている場合、競合が発生し、Dはメソッド自体を実装する必要がありますが、BまたはCのいずれかで実装されたバージョンにコールバックすることで実行できます(または条件を設定して使用できます)両方とも異なる場合)。

interface A {  } 
interface B implements A { void m() default {println("In A");} } 
interface C implements A { void m() default {println("In B");} } 
}  
class D implements B, C {  
    public void m() { println("In D"); B.super.m(); } 
} 

ただし、Java 8の新機能に関するOracleのページにアクセスして、すべてを読むことができます。「Java8の新機能」をグーグルで検索してそこにたどり着きました。http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdfで私が考えていたものを見つけました

于 2013-02-04T18:04:53.713 に答える
0

オブジェクトから継承するクラスから継承します。Javaでは、2つの異なるクラスチェーンから継承することはできません。ただし、これを回避する方法は、インターフェイスを使用することです。

于 2013-02-04T17:57:12.527 に答える
0

しかし、オブジェクトと他のクラスを同時に継承するにはどうすればよいでしょうか?

これはできません。聞き間違いです。

次に、11 個のオブジェクト メソッドをすべて継承する必要があるのはなぜでしょうか。なぜI / Oでそれらが必要なのか、ほとんど想像できませんでした。

ここで何を話しているのかわからない。

インターフェイス A がデフォルトの実現を持つメソッド a() を提供し、インターフェイス B も別のデフォルトの実現を持つメソッド a() を提供し、カスタム クラス C が両方のインターフェイスを実装し、デフォルトの実現に依存しているとしたら、それは Diamond of Death ではないでしょうか?

JDK8については何も知りませんが、2つのインターフェースで同じ名前/型の署名を持つメソッドをすでに実装できます。これはおそらく非論理的ですが、Javaでは許可されています。

于 2013-02-04T17:58:53.330 に答える
0

まず、Java ではすべてがオブジェクトまたはプリミティブであるため、ここで問題はありません。オブジェクトは階層の最上位のクラスです。

現時点では、すでに Java に複数のインターフェースを適用できます。その後、実現を記述します。Java 8では、インターフェースを定義すると、実現できると思います。そうでない場合は、何らかのデフォルトが使用されます。複数のデフォルトが定義されている (またはメソッドが複数のインターフェースによって宣言されている) 場合、デフォルトは使用されません。それは非常に簡単です。

于 2013-02-04T17:59:30.293 に答える