ホームページ  >  記事  >  Java  >  Javaに多重継承がない理由

Javaに多重継承がない理由

(*-*)浩
(*-*)浩オリジナル
2019-05-21 11:44:512581ブラウズ

Java は単一継承のみをサポートし、多重継承は許可しません。単一継承とは、クラスが 1 つの親クラスのみを持つことができることを意味し、多重継承とは、クラスが複数の親クラスを持つことができることを意味します。

Javaに多重継承がない理由

Java は複数レベルの継承を持つことができます。つまり、クラスは特定のクラスのサブクラスを継承できます。たとえば、クラス B はクラス A を継承し、クラス C はクラス A を継承します。クラス B. を継承すると、クラス C もクラス A

を間接的に継承します。サブクラスは親クラスのすべてのメンバー変数とメソッドを継承できますが、サブクラスは親クラスのコンストラクターを継承することはできません。サブクラスのコンストラクターでは、ステートメント super (パラメーター リスト) を使用して、親クラスのコンストラクターを呼び出すことができます。

クラスは属性とメソッドを定義し、特定の型の抽象化を記述します。

論理的に言えば、単一継承により、サブクラスがそのクラスによって表現されるものの中に含まれるべきであることが明確になります。親クラス より具体的なカテゴリは、この種のものとその種のものの両方であるべきではありません
そして、実用的な観点から見ると、単一継承は読みやすく、保守しやすく、明確なセマンティクスと明確なロジックを備えています

多重継承によって引き起こされる問題。ダイヤモンドクライシス:

  A foo()
       / \
      /   \
  B foo()   C foo()
      \   /
       \ /
      D foo()

クラス A にパブリック メソッド fun() があり、クラス B とクラス C が同時にクラス A を継承し、クラス B またはクラス C がそれぞれ fun( ) オーバーライドすると、クラス D が多重継承によってクラス B とクラス C の両方を継承し、ダイヤモンド危機につながります。プログラムの実行時に、対応するメソッド fun() をどのように判断するか?

class A{
    public void foo(){
    }
}
class B extends A{
    public void foo(){
    }
}
class C extends A{
    public void foo(){
    }
}
//Not allowed here.
public class D extends B, C{
    public void foo(){
    }
}

(1) サブクラスが継承する複数の親クラスに同じ名前のインスタンス変数がある場合、サブクラスは変数を参照する際にあいまいさが発生し、どの親クラス変数を使用するかを決定できなくなります。

(2) サブクラスが継承した複数の親クラスに同じメソッドがあり、そのメソッドがサブクラスでオーバーライドされているかどうかは、メソッド呼び出し時にあいまいさが発生し、どれであるかを判断できなくなります。親クラスを呼び出す必要があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。