ホームページ >Java >&#&チュートリアル >Java が多重継承をサポートしないのはなぜですか?

Java が多重継承をサポートしないのはなぜですか?

王林
王林転載
2023-05-13 10:04:14965ブラウズ

まず、このシナリオについて考えてみましょう。クラス A がクラス B とクラス C を継承し、test() メソッドがクラス B とクラス C の両方に存在する場合、クラス A のオブジェクトが test() メソッドを呼び出すと、 , クラスBのtest()を呼び出してみてはどうでしょうか?あるいは、クラス C の test() はどうでしょうか?答えはないので、Java では多重継承は許可されていません。

ただし、Java のインターフェイスは次のように複数継承できます。

public interface A {
    void test();
}
public interface B {
    void test();
}
public interface C extends A, B{
}

なぜインターフェイスは継承できるのでしょうか?

A、B、C はすべてインターフェイスであるため、インターフェイス A と B の両方でテスト メソッドが定義されている場合でも、インターフェイスは メソッドを宣言しているだけであるため、実際には実装されません。 .メソッドなのでCインタフェースでは問題ありませんが、Cインタフェースの場合は同じtest()メソッドの宣言を継承するだけなので、利用する場合はCインタフェースの実装クラスが必要です。この test() メソッドを実装するだけです。

public class C1 implements C{
    public void test() {
        System.out.println("hello Hoeller");
    }
}
つまり、インターフェイスにはデフォルトのメソッドはないのでしょうか?インターフェイスにメソッドを実装することもできないのでしょうか?

直接テストしてみましょう:

public interface A {
    default void test() {
        System.out.println("a");
    }
}
public interface B {
    default void test() {
        System.out.println("b");
    }
}
public interface C extends A, B{
}

この時点で、C インターフェイスはコンパイルされてエラーを報告します。エラー メッセージは:

com.hoeller です。 C は、型 com.hoeller.A および com.hoeller.B

から test () の関連のないデフォルトを継承します。翻訳されるかどうかは関係ありません。いずれにせよ、次のことを示すエラーが報告されます。 C インターフェイスは、両方のインターフェイスのデフォルト メソッド test() を同時に継承できません。

以上がJava が多重継承をサポートしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。