types inheritance java single vs multiple inheritance
Naučte se vše o různých typech dědičnosti v Javě pomocí jednoduchých příkladů. Zjistěte, zda Java podporuje více dědičností:
V našem posledním kurzu jsme představili dědičnost v Javě spolu s různými základními pojmy týkajícími se dědičnosti pro čtenáře.
V tomto kurzu prozkoumáme dále téma dědičnosti a zjistíme více o typech dědičnosti.
=> Zkontrolujte VŠECHNY výukové programy Java zde.
otázky a odpovědi na mýdlo pro zkušené
Co se naučíte:
Druhy dědičnosti v Javě
V závislosti na způsobu zdědění tříd a počtu zděděných tříd máme následující typy dědičnosti, jak je znázorněno na následujícím obrázku.
Jak je znázorněno na výše uvedeném obrázku, v objektově orientovaném programování existuje pět typů dědičnosti, jak je popsáno níže:
# 1) Jednoduché dědictví: Když odvozená třída nebo podtřída dědí pouze z jedné základny nebo nadtřídy, pak jde o jednu dědičnost.
# 2) Víceúrovňová dědičnost: V Multilevel Inheritance máme více než jednu úroveň, kde třída dědí ze základní třídy a odvozená třída je zděděna jinou třídou.
# 3) Hierarchická dědičnost: Hierarchie dědičnosti se v tomto typu dědičnosti vytvoří, když je nadtřída zděděna více než jednou třídou.
# 4) Vícenásobné dědictví: Vícenásobná dědičnost je ta, ve které třída může zdědit vlastnosti a chování od více než jednoho rodiče.
# 5) Hybridní dědičnost: Když se spojí jeden nebo více typů dědičnosti, stane se hybridní dědičností.
Všimněte si, že Java podporuje pouze jeden, víceúrovňový a hierarchický typ dědičnosti pomocí tříd. Java nepodporuje vícenásobné a hybridní dědičnost s třídami.
Nyní budeme podrobně diskutovat o každém typu dědičnosti s příklady programování.
Jedna dědičnost v Javě
Je znázorněno jedno dědictví, jak je znázorněno níže:
Zde podtřída dědí z jedné nadtřídy. Toto je jedno dědictví. Každé zvíře, jako je pes, zdědí od živočišného druhu. Toto je nejjednodušší forma dědictví.
Níže je uveden program Java, který vysvětluje Single Inheritance.
//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 } }
Výstup:
Tady máme jednu metodu jíst (Action_eat) v základní třídě Zvíře, která je společná pro druhy zvířat. Máme odvozenou třídu Pes, která pochází ze třídy zvířat. Ve třídě Dog máme metodu specifickou pro Dog Dog, Bark (Action_bark).
Poté v hlavní metodě vytvoříme objekt Dog a protože třída Dog zdědila třídu Animal, může tento objekt volat metodu jíst i kůra.
Víceúrovňová dědičnost v Javě
Ve víceúrovňové dědičnosti máme řetězec dědičnosti. To znamená, že máme nadřazenou třídu, která je zděděna odvozenou třídou. Odvozená třída zase funguje jako nadřazená pro jinou třídu atd.
Víceúrovňovou dědičnost lze znázornit níže:
Jak je vidět na výše uvedeném obrázku, existuje nadřazená třída A. Třída B dědí z třídy A. Pak existuje další třída C, která zase dědí z třídy B. Vidíme tedy, že tvoří řetězec dědičnosti. Zde se třída B stane prostřední třídou, která spojuje třídy A a C.
Pokračováním níže uvedeného příkladu třídy Zvířata můžeme mít třídu Pes odvozenou z třídy Zvířata. Pak můžeme mít další třídu Puppy, což je malý pes odvozený z třídy Dog. Tímto způsobem můžeme mít víceúrovňové dědictví.
Níže je uveden příklad programu pro víceúrovňovou dědičnost.
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 } }
Výstup:
Naprogramovali jsme přesný řetězec zobrazený výše. Potom v hlavní metodě vytvoříme objekt třídy C. Objekt třídy C pak může přistupovat k metodám svého nadřazeného B i prarodiče A.
Hierarchická dědičnost v Javě
Třída může mít více než jednu třídu z ní odvozenou. Takže máme jednu základní nebo nadtřídu a více než jednu podtřídu. Tento typ dědičnosti se nazývá „hierarchická dědičnost“.
Hierarchická dědičnost je schematicky znázorněna níže:
Jako příklad hierarchické dědičnosti můžeme reprezentovat třídu zvířat jako nadtřídu a poté z ní odvodit více než jedno zvíře, jako je kočka, pes, kráva atd.
Níže uvedený program Java demonstruje hierarchickou dědičnost v Javě.
//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 } }
Výstup:
Jak vidíme z programu, máme rodičovskou třídu a tři podřízené třídy odvozené od tohoto rodiče. V hlavní metodě vytvoříme objekt každé z podřízených tříd a zavoláme jejich příslušné členské metody.
Pro volání metod nadřazené třídy si všimněte, že můžeme použít jakýkoli z objektů podřízené třídy, protože všechny mají přístup k nadřazené třídě.
Vícenásobná dědičnost v Javě
Vícenásobná dědičnost je situace, kdy jedna třída může dědit z více než jedné třídy, tj. Jedna třída může mít více než jednoho rodiče. Tímto způsobem může třída mít více než jednu nadtřídu a získat tak vlastnosti a chování všech svých nadtříd.
Schematické znázornění vícenásobné dědičnosti je uvedeno níže:
Jak je uvedeno výše, můžeme odvodit třídu z více než jedné třídy současně. Takto odvozená třída získá vlastnosti všech svých nadřazených tříd. To může vést k vážným nejasnostem, zvláště když jsou zděděné funkce stejné.
Poznámka:Java nepodporuje vícenásobné dědění pomocí tříd. Ale podporuje vícenásobné dědění pomocí rozhraní, o kterých budeme diskutovat v našem dalším kurzu dědičnosti.
Vzhledem k tomu, že Java nepodporuje vícenásobné dědění s třídami, nebudeme zacházet do podrobností. Později v tomto kurzu se však pokusíme porozumět důvodům, proč Java nepodporuje vícenásobné dědění.
Hybridní dědičnost v Javě
Hybridní dědičnost je kombinace jednoho nebo více typů dědičnosti, o kterých jsme diskutovali výše. Jakákoli kombinace však má za následek typ vícenásobné dědičnosti, který Java nepodporuje.
Hybridní dědičnost může být schematicky znázorněna níže.
Proto Java nepodporuje hybridní dědičnost také u tříd. Ale stejně jako vícenásobná dědičnost, můžeme implementovat hybridní dědičnost v Javě pomocí rozhraní. Budeme o tom podrobně diskutovat v našem dalším tutoriálu.
Proč Java nepodporuje vícenásobné dědictví?
Java si klade za cíl jednoduchost programů. To platí i pro funkce OOP. Takže pokud jde o vícenásobné dědictví, mohou vzniknout některé nejednoznačné situace, když odvozujeme třídu z více než jedné třídy.
Nyní pochopme problémy, které mohou nastat, když máme v našem programu vícenásobné dědictví.
Zvažte následující systémy více dědičnosti.
Pokud vidíme výše uvedený systém, je to vysvětlující. Tady třída A a třída B jsou třídy s dvěma rodiči zděděné třídou C. Nyní jsme ukázali, že obě třídy A a B mají metodu se stejným názvem, tj. Print (). Když tedy třída C zdědí A a B, získá obě verze metody print ().
V tomto případě třída C neví, kterou metodu by měla zdědit. Jedná se o nejednoznačnou situaci, kterou jsme zmínili výše, která nastává v případě vícenásobného dědictví.
Proto Java vydá chybu kompilátoru, když třída dědí z více než jedné třídy.
Následující program Java to předvede.
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(); } }
Výstup:
Jak je vidět z výstupu, kompilátor Java vydá chybu, když zjistí, že třída rozšiřuje dvě třídy.
Ačkoli Java neumožňuje dědění dvou tříd současně, nabízí nám cestu kolem tohoto omezení. Můžeme simulovat více dědičnosti pomocí rozhraní namísto tříd. Budeme o tom diskutovat v našich dalších tutoriálech.
Diamond problém
Vícenásobné dědictví vede k situaci zvané „Diamantový problém“.
Vezměte v úvahu, že máme následující dědický systém.
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 }
Tento systém můžeme představit schematicky, jak je znázorněno níže:
jak přidat prvky pole
Jak vidíme z výše uvedeného diagramu, celý systém dědičnosti se objevuje ve tvaru kosočtverce. Kvůli této diamantové struktuře se nejednoznačnost nazývá „diamantový problém“.
Jak již bylo vysvětleno pro vícenásobné dědičnost, nejednoznačnost je zde vícenásobný počet kopií metody show (), kterou třída Sample získá v důsledku dědičnosti. Jelikož existuje více cest, dosahuje metodu show () a existuje nejednoznačnost ohledně toho, kterou kopii zdědit.
Stejně jako u vícenásobné dědičnosti lze problém s diamanty vyřešit také pomocí rozhraní.
Pravidla dědičnosti v Javě
Dosud jsme viděli základy dědičnosti i typy dědičnosti v Javě, vyjmenujme některá pravidla, která musíme dodržovat při vývoji aplikací s dědičností.
Pravidlo č. 1: Java nepodporuje vícenásobnou dědičnost
Jak jsme již viděli, Java nepodporuje vícenásobné dědění v jakékoli formě. Když se v programu pokusíte o více dědičností, kompilátor Java vydá chybu kompilátoru.
Pravidlo č. 2: Java nepovoluje cyklickou dědičnost
Třída, která se zdědí a vytvoří cyklus, se nazývá cyklická dědičnost.
Zvažte následující třídy, třída1 a třída2.
třída class1 rozšiřuje třídu 2 {}
třída class2 rozšiřuje třídu 1 {}
Výše uvedená situace tvoří smyčku. V prostředí Java to není povoleno.
Pravidlo č. 3: Nemůžeme zdědit soukromé datové členy
V tématu „Modifikátory přístupu“ jsme se již dozvěděli, že členy se soukromým přístupem nelze zdědit.
Pravidlo č. 4: Konstruktory nejsou zděděny
Protože konstruktory se používají k vytváření objektů třídy, nedědí se z jedné třídy do druhé.
Pravidlo č. 5: Můžeme použít rodičovský odkaz pro přístup k podřízeným objektům
Již jsme viděli různé příklady dědictví. Můžeme vytvořit odkaz na nadřazenou třídu typu a poté jí přiřadit odvozený objekt třídy vytvořený pomocí nového klíčového slova.
Pokud super je nadtřída a sub je třída odvozená od super, jak je uvedeno níže.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Pravidlo č. 6: Nadřazené konstruktory jsou prováděny z důvodu super () v odvozených konstruktorech
Jedno z pravidel uvádí, že konstruktory nelze zdědit. Ale konstruktor nadtřídy lze spustit uvnitř konstruktoru odvozené třídy pomocí volání super ().
Často kladené otázky
Otázka č. 1) Který typ dědičnosti není v Javě podporován?
Odpovědět: Java nepodporuje vícenásobné dědictví, protože může způsobit problémy v aplikacích, jako je diamantový problém. Java také nepodporuje hybridní dědičnost, protože je kombinací jednoho nebo více typů dědičnosti a může se nakonec proměnit v vícenásobnou dědičnost.
Otázka 2) Který z členů třídy lze zdědit?
Odpovědět: Třída může zdědit veřejné a chráněné členy své základní třídy, ale nemůže přistupovat k soukromým členům základní třídy.
Otázka č. 3) Proč není povoleno vícenásobné dědictví?
Odpovědět: Vícenásobná dědičnost vede k nejednoznačnosti, když třídy s dvěma rodiči mají metody se stejným prototypem. V tomto případě odvozená třída čelí nejednoznačnosti, pokud jde o to, ze které základní třídy by měla metodu zdědit.
Vícenásobná dědičnost může také mít za následek diamantový problém v Javě. Proto Java nepodporuje vícenásobné dědění.
Otázka č. 4) Proč potřebujete vícenásobné dědictví?
Odpovědět: Jazyky jako Java a C # vynucují vícenásobnou dědičnost pomocí více rozhraní. Takže když potřebujeme zdědit funkce z více než jednoho rozhraní, pak potřebujeme vícenásobné dědění.
Otázka č. 5) Jaké je hlavní využití víceúrovňové dědičnosti?
Odpovědět: O třídě odvozené od jiné třídy, která je zase odvozena od třetí třídy, se říká, že vykazuje víceúrovňovou dědičnost. Úrovně v tomto typu dědičnosti lze rozšířit na libovolné číslo, pokud je zachována jasnost a jednoduchost.
Můžeme znázornit různé úrovně druhů pomocí víceúrovňové dědičnosti. Z hlediska programování, když chceme reprezentovat různé úrovně tříd aplikací, přejdeme k víceúrovňové dědičnosti.
Závěr
V tomto kurzu jsme diskutovali o typech dědičnosti v Javě. Java podporuje pouze jedno, víceúrovňové a hierarchické typy dědičnosti. Java nepodporuje vícenásobnou a hybridní dědičnost. Diskutovali jsme o nejednoznačnosti vícenásobné dědičnosti a diamantovém problému v Javě.
Poté jsme diskutovali o různých pravidlech, která bychom měli dodržovat při implementaci dědičnosti v Javě. Tím jsme dokončili naši diskusi o vztahu IS-A v Javě.
=> Dávejte pozor na jednoduchou sérii školení Java zde.
Doporučené čtení
- Co je dědičnost v Javě - návod s příklady
- Dědičnost v C ++
- Typy dědičnosti v C ++
- Základy jazyka Java: Java Syntax, třída Java a základní koncepty Java
- Celé číslo Java a třída Java BigInteger s příklady
- Typy tříd v Javě: abstraktní, konkrétní, konečné, statické
- Proměnné Java a jejich typy s příklady
- Výukový program třídy skeneru Java s příklady