types inheritance java single vs multiple inheritance
簡単な例を使用して、Javaのさまざまなタイプの継承についてすべて学びます。 Javaが多重継承をサポートしているかどうかを調べます。
前回のチュートリアルでは、Javaでの継承と、継承に関連するさまざまな基本概念を読者に紹介しました。
このチュートリアルでは、継承のトピックをさらに詳しく調べ、継承の種類について詳しく学びます。
=> ここですべてのJavaチュートリアルを確認してください。
Webサービスをどのようにテストしますか
学習内容:
Javaでの継承の種類
クラスの継承方法と継承されるクラスの数に応じて、次の図に示すように、次のタイプの継承があります。

上図に示すように、オブジェクト指向プログラミングには、以下に説明するように5種類の継承があります。
#1)単一継承: 派生クラスまたはサブクラスが1つのベースクラスまたはスーパークラスからのみ継承する場合、それは単一の継承です。
#2)マルチレベル継承: マルチレベル継承では、クラスが基本クラスから継承し、派生クラスが別のクラスに継承される複数のレベルがあります。
#3)階層的継承: スーパークラスが複数のクラスに継承されると、このタイプの継承で継承階層が形成されます。
#4)多重継承: 多重継承は、クラスが複数の親からプロパティと動作を継承できるものです。
#5)ハイブリッド継承: 1つ以上のタイプの継承が組み合わされると、ハイブリッド継承になります。
Javaは、クラスを使用した単一、マルチレベル、および階層型の継承のみをサポートすることに注意してください。 Javaは、クラスによる複数のハイブリッド継承をサポートしていません。
次に、プログラミング例を使用して、各タイプの継承について詳しく説明します。
Javaでの単一継承
単一の継承は、次のように表されます。

ここで、サブクラスは単一のスーパークラスから継承します。これは単一の継承です。犬のような動物はすべて動物種から受け継いでいます。これは最も単純な形式の継承です。
以下に示すのは、単一継承を説明するJavaプログラムです。
//base class:Animal class Animal { void Action_eat() { System.out.print('eating...'); } } //derived class:Dog class Dog extends Animal { void Action_bark() { System.out.print('barking...'); } } class Main{ public static void main(String args()){ Dog d=new Dog(); //create an object of derived class System.out.print('The dog is '); d.Action_bark(); //call derived class method System.out.print('
The dog is '); d.Action_eat(); //call base class method } } 出力:

ここでは、動物種に共通の基本クラスAnimalに1つのメソッドeat(Action_eat)があります。動物クラスから派生した派生クラスDogがあります。 Dogクラスには、Dog種に固有のメソッドbark(Action_bark)があります。
次に、mainメソッドでDogオブジェクトを作成し、DogクラスがAnimalクラスを継承しているため、このオブジェクトは、barkメソッドだけでなくeatメソッドも呼び出すことができます。
Javaでのマルチレベル継承
マルチレベルの継承では、継承のチェーンがあります。これは、派生クラスに継承される親クラスがあることを意味します。派生クラスは、別のクラスの親として機能します。
マルチレベルの継承は、次のように表すことができます。

上の図に示すように、親クラスAがあります。クラスBはクラスAから継承します。次に、クラスBから継承する別のクラスCがあります。したがって、継承のチェーンを形成していることがわかります。ここで、クラスBは、クラスAとクラスCを接続する中間クラスになります。
以下のAnimalクラスの例を続けると、Animalクラスから派生したDogクラスを持つことができます。次に、Dogクラスから派生した赤ちゃん犬である別のクラスのPuppyを作成できます。このようにして、マルチレベルの継承を行うことができます。
マルチレベル継承のプログラム例を以下に示します。
import java.util.*; import java.lang.*; import java.io.*; //parent class A class A { public void print_A() { System.out.print('SoftwareTestingHelp '); } } //Derived class B - intermediary class B extends A { public void print_B() { System.out.print('Java Series '); } } //Derived Class C class C extends B { public void print_C() { System.out.print('Tutorials'); } } public class Main { public static void main(String() args) { C c_obj = new C(); //create Class C obj c_obj.print_A(); //call grandparent class method c_obj.print_B(); //call parent class method c_obj.print_C(); //call member method } }出力:

上記の正確なチェーンをプログラムしました。次に、mainメソッドで、クラスCのオブジェクトを作成します。クラスCオブジェクトは、その親Bと祖父母Aのメソッドにアクセスできます。
Javaでの階層継承
クラスには、そのクラスから派生した複数のクラスを含めることができます。したがって、1つのベースクラスまたはスーパークラスと複数のサブクラスがあります。このタイプの継承は「階層継承」と呼ばれます。
階層継承は、以下に図式的に表されます。

階層継承の例として、Animalクラスをスーパークラスとして表し、Cat、Dog、Cowなどの複数の動物を派生させることができます。
以下のJavaプログラムは、Javaの階層継承を示しています。
//class Parent class Parent { public void print_parent() { System.out.println('In ::Parent class'); } } //child1 class class Child1 extends Parent { public void print_child1() { System.out.println('In ::Child1 class'); } } //child2 class class Child2 extends Parent { public void print_child2() { System.out.println('In ::Child2 class'); } } //child3 class class Child3 extends Parent { public void print_child3() { System.out.println('In ::Child3 class'); } } public class Main { public static void main(String() args) { Child1 ch1 = new Child1(); //create a Child1 class object ch1.print_child1(); //call its member method Child2 ch2 = new Child2(); //create a Child2 class object ch2.print_child2(); //call its member method Child3 ch3 = new Child3(); //create a Child3 class object ch3.print_child3(); //call its member method ch3.print_parent(); //call parent class method with any object } } 出力:

プログラムからわかるように、親クラスと、この親から派生した3つの子クラスがあります。 mainメソッドでは、各子クラスのオブジェクトを作成し、それぞれのメンバーメソッドを呼び出します。
親クラスのメソッドを呼び出す場合、すべてが親クラスにアクセスできるため、任意の子クラスオブジェクトを使用できることに注意してください。
Javaでの多重継承
多重継承は、1つのクラスが複数のクラスから継承できる状況です。つまり、1つのクラスが複数の親を持つことができます。これを行うことにより、クラスは複数のスーパークラスを持つことができ、したがって、そのすべてのスーパークラスのプロパティと動作を取得できます。
多重継承の図式表現を以下に示します。

上に示したように、複数のクラスから同時にクラスを派生させることができます。このようにして、派生クラスはそのすべての親クラスの機能を取得します。これは、特に継承された機能が同じである場合に、深刻なあいまいさを引き起こす可能性があります。
注意:Javaは、クラスを使用した多重継承をサポートしていません。ただし、継承に関する次のチュートリアルで説明するインターフェイスを使用した多重継承をサポートしています。
Javaはクラスによる多重継承をサポートしていないため、詳細については説明しません。ただし、チュートリアルの後半で、Javaが多重継承をサポートしない理由を理解しようとします。
Javaでのハイブリッド継承
ハイブリッド継承は、上記で説明した1つ以上のタイプの継承の組み合わせです。ただし、任意の組み合わせは、Javaでサポートされていないタイプの多重継承になります。
ハイブリッド継承は、以下のように図式的に表すことができます。

したがって、Javaはクラスとのハイブリッド継承もサポートしていません。しかし、多重継承のように、インターフェースを使用してJavaでハイブリッド継承を実装できます。これについては、次のチュートリアルで詳しく説明します。
Javaが多重継承をサポートしないのはなぜですか?
Javaは、プログラムの簡素化を目指しています。これは、OOP機能にも当てはまります。したがって、多重継承に関しては、複数のクラスからクラスを派生させるときに、あいまいな状況が発生する可能性があります。
次に、プログラムに多重継承がある場合に発生する可能性のある問題を理解しましょう。
次の多重継承システムを検討してください。

上記のシステムを見れば、それは自明です。ここで、クラスAとクラスBは、クラスCに継承された2つの親クラスです。これで、クラスAとBの両方に同じ名前のメソッド(print())があることを示しました。したがって、クラスCがAとBを継承すると、両方のバージョンのprint()メソッドを取得します。
この場合、クラスCはどのメソッドを継承する必要があるかを知りません。これは、多重継承の場合に発生する、前述のあいまいな状況です。
したがって、クラスが複数のクラスから継承すると、Javaはコンパイラエラーを発行します。
次のJavaプログラムは、これを示しています。
class A{ void print(){ System.out.println('Class A :: print()'); } } class B{ void print(){ System.out.println('Class B :: print()'); } } class C extends A , B{ //let C inherit from A and B } public class Main { public static void main(String() args) { C cObj = new C(); c.print(); } } 出力:

出力からわかるように、Javaコンパイラは、クラスが2つのクラスを拡張していることを検出すると、エラーを発行します。
Javaでは2つのクラスを同時に継承することはできませんが、この制限を回避する方法を提供します。クラスの代わりにインターフェイスを使用して、多重継承をシミュレートできます。これについては、以降のチュートリアルで説明します。
ダイヤモンド問題
多重継承は「ダイヤモンド問題」と呼ばれる状況をもたらします。
次の継承システムがあると考えてください。
class Super{ void show(){} } class Sub1 extends super{ void show1(){} } class Sub2 extends super{ void show2(){} } class sample extends Sub1,Sub2{ //Sample class code here } このシステムは、次のように図式的に表すことができます。

上の図からわかるように、継承システム全体がひし形で表示されます。このダイアモンド構造のため、あいまいさは「ダイアモンド問題」と呼ばれます。
多重継承について前に説明したように、ここでのあいまいさは、Sampleクラスが継承の結果として取得するshow()メソッドの複数のコピーです。複数のパスがあるため、show()メソッドを実現し、どのコピーを継承するかに関してあいまいさがあります。
多重継承と同様に、ダイヤモンドの問題もインターフェイスを使用して解決できます。
Javaの継承ルール
これまで、継承の基本とJavaでの継承の種類について説明してきましたが、継承を使用してアプリケーションを開発する際に従う必要のあるルールをいくつか挙げてみましょう。
ルール#1:Javaは多重継承をサポートしていません
すでに見てきたように、Javaはいかなる形式の多重継承もサポートしていません。プログラムで多重継承が試行されると、Javaコンパイラはコンパイラエラーを発行します。
新入生のためのネットインタビューの質問と回答
ルール#2:Javaは循環継承を許可しません
サイクルを形成するためにそれ自体を継承するクラスは、CyclicInheritanceと呼ばれます。
次のクラス、class1とclass2について考えてみます。
クラスclass1はクラス2を拡張します{}
クラスclass2はクラス1を拡張します{}
上記の状況はループを形成します。これはJavaでは許可されていません。
ルール#3:プライベートデータメンバーを継承することはできません
「アクセス修飾子」のトピックで、プライベートアクセスを持つメンバーは継承できないことをすでに学びました。
ルール#4:コンストラクターは継承されません
コンストラクターはクラスオブジェクトの作成に使用されるため、あるクラスから別のクラスに継承されません。
ルール#5:親参照を使用して子オブジェクトにアクセスできます
継承のさまざまな例をすでに見てきました。親クラス型の参照を作成し、newキーワードを使用して作成された派生クラスオブジェクトを割り当てることができます。
以下に示すように、superがスーパークラスで、subがsuperから派生したクラスである場合。
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }ルール#6:派生コンストラクターのsuper()のため、親コンストラクターが実行されます
ルールの1つは、コンストラクターを継承できないことを示しています。ただし、スーパークラスのコンストラクターは、super()呼び出しを使用して、派生クラスのコンストラクター内で実行できます。
よくある質問
Q#1)Javaでサポートされていない継承のタイプはどれですか?
回答: Javaは、菱形継承問題などのアプリケーションで問題を引き起こす可能性があるため、多重継承をサポートしていません。 Javaは、1つ以上の継承タイプの組み合わせであり、最終的に多重継承に変わる可能性があるため、ハイブリッド継承もサポートしていません。
Q#2)クラスのどのメンバーを継承できますか?
回答: クラスは、基本クラスのパブリックメンバーと保護されたメンバーを継承できますが、基本クラスのプライベートメンバーにアクセスすることはできません。
Q#3)多重継承が許可されないのはなぜですか?
回答: 2つの親クラスに同じプロトタイプのメソッドがある場合、多重継承はあいまいさをもたらします。この場合、派生クラスは、どの基本クラスからメソッドを継承する必要があるかに関してあいまいに直面します。
多重継承は、Javaでダイヤモンドの問題を引き起こす可能性もあります。したがって、Javaは多重継承をサポートしていません。
Q#4)なぜ多重継承が必要なのですか?
回答: JavaやC#などの言語は、複数のインターフェイスを使用して多重継承を強制します。したがって、複数のインターフェイスから機能を継承する必要がある場合は、多重継承が必要です。
Q#5)マルチレベル継承の主な用途は何ですか?
回答: 3番目のクラスから派生した別のクラスから派生したクラスは、マルチレベルの継承を示すと言われます。このタイプの継承のレベルは、明快さと単純さを維持する限り、任意の数に拡張できます。
マルチレベルの継承を使用して、さまざまなレベルの種を表現できます。プログラミングの観点から、さまざまなレベルのアプリケーションクラスを表現したい場合は、マルチレベルの継承を行います。
結論
このチュートリアルでは、Javaの継承の種類について説明しました。 Javaは、単一、マルチレベル、および階層型の継承のみをサポートします。 Javaは、複数継承とハイブリッド継承をサポートしていません。 Javaでの多重継承のあいまいさとDiamondの問題について説明しました。
次に、Javaで継承を実装する際に従う必要のあるさまざまなルールについて説明しました。これで、JavaでのIS-A関係についての説明が完了しました。
=> ここで簡単なJavaトレーニングシリーズに注意してください。