Javaのデフォルトメソッドを使用してダイヤモンド問題を解決する方法
継承 1つのクラスが他のクラスのプロパティを継承する2つのクラス間の関係です。この関係は、extendsキーワードを使用して-
として定義できます。public class A extends B{
}
プロパティを継承するクラスはサブクラスまたは子クラスと呼ばれ、プロパティを継承するクラスはスーパークラスまたは親クラスです。
継承では、スーパークラスメンバーのコピーがサブクラスオブジェクトに作成されます。したがって、サブクラスオブジェクトを使用すると、両方のクラスのメンバーにアクセスできます。
多重継承とは、1つのクラスが複数のクラスのプロパティを継承することです。言い換えると、多重継承では、1つの子クラスとn個の親クラスを持つことができます。 Javaは(クラスを使用した)多重継承をサポートしていません。
菱形継承問題
- たとえば、Javaが多重継承をサポートしていると仮定しましょう。
- そして、 Sampleという名前の抽象クラスがある場合 抽象メソッドdemo()。
- 次に、同じパッケージ内の他の2つのクラスがこのクラスを拡張し、その抽象メソッド demo()を実装しようとした場合。
- 次に、継承の基本ルールに従って、両方のdemo()メソッドのコピーをサブクラスオブジェクトに作成し、同じプロトタイプ(名前と引数)を持つ2つのメソッドをサブクラスに残します。
- 次に、サブクラスコンパイラのオブジェクトを使用してdemo()メソッドを呼び出すと、呼び出すメソッドがわからないというあいまいな状況に直面します。この問題は、Javaではダイヤモンド問題として知られています。
菱形継承問題の解決策
デフォルトのメソッド(Java8)とインターフェースを使用して、Javaで多重継承を実現できます。
Java8以降のデフォルトのメソッド インターフェイスに導入されます。他の抽象メソッドとは異なり、これらはデフォルトの実装を持つインターフェースのメソッドです。インターフェイスにデフォルトのメソッドがある場合、このインターフェイスをすでに実装しているクラスでそれをオーバーライド(本文を提供)する必要はありません。
2つの異なるインターフェースで同じデフォルトのメソッド(同じ名前と署名)を持つことができ、クラスからこれら2つのインターフェースを実装できます。
その場合は、デフォルトのメソッドとそのインターフェース名を明示的に指定して、クラスのデフォルトのメソッドをオーバーライドする必要があります。
例
interface MyInterface1{ public static int num = 100; public default void display() { System.out.println("display method of MyInterface1"); } } interface MyInterface2{ public static int num = 1000; public default void display() { System.out.println("display method of MyInterface2"); } } public class InterfaceExample implements MyInterface1, MyInterface2{ public void display() { MyInterface1.super.display(); //or, MyInterface2.super.display(); } public static void main(String args[]) { InterfaceExample obj = new InterfaceExample(); obj.display(); } }
出力
display method of MyInterface1 display method of MyInterface2
-
Javaのデフォルトメソッドを使用して菱形継承問題を解決するにはどうすればよいですか?
継承 1つのクラスが他のクラスのプロパティを継承する2つのクラス間の関係です。この関係は、extendsキーワードを使用して-として定義できます。 public class A extends B{ } プロパティを継承するクラスはサブクラスまたは子クラスと呼ばれ、プロパティを継承するクラスはスーパークラスまたは親クラスです。 継承では、スーパークラスメンバーのコピーがサブクラスオブジェクトに作成されます。したがって、サブクラスオブジェクトを使用すると、両方のクラスのメンバーにアクセスできます。 複数の遺産: 利用可能な継承には、単一、マルチレベル、階層、複数、およびハイブリッドのさまざ
-
Javaのデフォルトメソッドを使用してダイヤモンド問題を解決する方法
継承 1つのクラスが他のクラスのプロパティを継承する2つのクラス間の関係です。この関係は、extendsキーワードを使用して-として定義できます。 public class A extends B{} プロパティを継承するクラスはサブクラスまたは子クラスと呼ばれ、プロパティを継承するクラスはスーパークラスまたは親クラスです。 継承では、スーパークラスメンバーのコピーがサブクラスオブジェクトに作成されます。したがって、サブクラスオブジェクトを使用すると、両方のクラスのメンバーにアクセスできます。 多重継承とは、1つのクラスが複数のクラスのプロパティを継承することです。言い換えると、多重継承