多重継承とは、サブクラスが複数の親クラスから同時に継承できるため、複数の親クラスの特性を同時に持つことができることを意味しますが、重大な欠点があります。
1. サブクラスが継承した親クラスに同じメンバ変数がある場合、サブクラスは変数を参照するときにどの親クラスのメンバ変数を使用するかを決定できません。 。
例:
public class classA // 父类 classA { private int num = 0; } public class classB // 父类 classB { private int num = 1; } public class classC extends classA,classB // 子类 classC 继承于 classA 和 classB { public static void main(String [] args) { classC obj = new classC(); obj.print(); // 调用父类成员变量 num , 那 num 等于 0 还是 1 ? } public void print() { System.out.println(super.num); } }
2. サブクラスによって継承された複数の親クラスが同じメソッドを持ち、サブクラスがそのメソッドをオーバーライドしない場合 (カバーされている場合は、このメソッドをサブクラスで直接使用する場合)、このメソッドを呼び出すときにどの親クラスのメソッドを呼び出すかを決定できません。
例:
public class classA // 父类 classA { public void fun() { System.out.print("hello"); } } public class classB // 父类 classB { public void fun() { System.out.print("hello"); } } public class classC extends classA,classB { public static void main(String [] args) { classC t = new classC(); t.print(); } public void print() { super.fun(); // 调用父类中 fun 方法,但由于classA、classB都有fun()方法,将无法确定使用 // 哪个父类中的方法 } }
したがって、Java では単一継承のみが許可されます。つまり、サブクラスは 1 つの親クラスからのみ継承できます。しかし、サブクラスの機能を拡張するために、Java はインターフェースを使用して、多重継承を使用しないことによる欠点を克服します。
インターフェイスは特別な抽象クラスです。インターフェイス内のメンバー変数はデフォルトで静的な最終型 (定数) になり、インターフェイス内のメソッドは抽象的でメソッド本体がありません。
特定のメソッドは、インターフェイスを実装するクラスによってのみ実装できます。呼び出し時には、常に実装クラスのメソッドのみが呼び出されます (曖昧さはありません)。そのため、多重継承の 2 番目の欠点はありません。 ; そしてインターフェイスのせいで静的定数しかありませんが、静的変数はコンパイル時に呼び出し関係を決定するため、何らかの競合がある場合でもコンパイル時にエラーが表示されます; 静的変数を参照する場合は、一般的にクラスを使用します曖昧さを避けるために名前またはインターフェイス名を直接使用するため、多重継承の最初の欠点も存在しません。これらの欠点は、インターフェイスが複数の親インターフェイスを継承する場合には存在しません。
以上がJava ではなぜ多重継承ができないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。