types inheritance java single vs multiple inheritance
Naučte sa všetko o rôznych druhoch dedičstva v Jave pomocou jednoduchých príkladov. Zistite, či Java podporuje viacnásobné dedenie:
V našom poslednom návode sme predstavili dedičnosť v Jave spolu s rôznymi základnými konceptmi súvisiacimi s dedičstvom pre čitateľov.
V tomto tutoriále sa budeme ďalej venovať téme dedičstva a dozvieme sa viac o druhoch dedičstva.
=> Skontrolujte VŠETKY návody Java tu.
ako pridať do poľa reťazcov
Čo sa dozviete:
Druhy dedenia v Jave
V závislosti od spôsobu dedenia tried a počtu dediacich tried máme nasledujúce typy dedenia, ako je znázornené na nasledujúcom obrázku.
Ako je znázornené na vyššie uvedenom obrázku, v objektovo orientovanom programovaní je popísaných päť typov dedičstva:
# 1) Dedičné dedičstvo: Keď odvodená trieda alebo podtrieda dedí iba z jednej základnej alebo nadtriedy, potom ide o jednoduché dedičstvo.
# 2) Viacúrovňové dedičstvo: Vo viacúrovňovej dedičnosti máme viac ako jednu úroveň, kde trieda dedí zo základnej triedy a odvodená trieda je zasa dedená inou triedou.
# 3) Hierarchické dedičstvo: Hierarchia dedičstva sa pri tomto type dedičstva vytvorí, keď nadtriedu zdedí viac ako jedna trieda.
# 4) Viacnásobné dedičstvo: Viacnásobné dedičstvo je také, v ktorom môže trieda dediť vlastnosti a správanie od viac ako jedného rodiča.
# 5) Hybridné dedičstvo: Ak sa spojí jeden alebo viac druhov dedičstva, stane sa z nich hybridné dedičstvo.
Upozorňujeme, že jazyk Java podporuje iba jeden, viacúrovňový a hierarchický typ dedenia pomocou tried. Java nepodporuje viacnásobné a hybridné dedenie s triedami.
Teraz si podrobne rozoberieme každý typ dedičstva na príkladoch programovania.
Single dedičstvo v Jave
Jedno dedičstvo je zobrazené tak, ako je uvedené nižšie:
Tu podtrieda dedí z jednej nadtriedy. Toto je jedno dedičstvo. Akékoľvek zviera ako pes dedí zo zvieracích druhov. Toto je najjednoduchšia forma dedičstva.
Ďalej je uvedený program Java, ktorý vysvetľuje 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ýkon:
Tu máme jednu metódu eat (Action_eat) v základnej triede Animal, ktorá je spoločná pre živočíšne druhy. Máme odvodenú triedu Pes, ktorá pochádza z triedy Zvieratá. V triede Pes máme metódu špecifickú pre druhy psov, štekanie (Action_bark).
Potom v hlavnej metóde vytvoríme objekt Pes a keďže trieda Pes zdedila triedu Zviera, môže tento objekt nazývať metódu jesť aj kôru.
Viacúrovňové dedičstvo v Jave
Vo viacúrovňovom dedičstve máme dedičský reťazec. To znamená, že máme nadradenú triedu, ktorú zdedí odvodená trieda. Odvodená trieda zase funguje ako rodič inej triedy atď.
Viacúrovňové dedičstvo je možné znázorniť takto:
Ako je vidieť na obrázku vyššie, existuje rodičovská trieda A. Trieda B dedí z triedy A. Potom existuje ďalšia trieda C, ktorá zase dedí z triedy B. Vidíme teda, že tvorí reťaz dedičnosti. Tu sa trieda B stane sprostredkovateľskou triedou, ktorá spája triedy A a C.
Pokračovaním nášho príkladu triedy Zviera nižšie, môžeme mať triedu psov odvodenú z triedy zvierat. Potom môžeme mať ďalšiu triedu Šteňa, ktorá je malým psom odvodeným z triedy Psov. Týmto spôsobom môžeme mať viacúrovňové dedičstvo.
Nižšie je uvedený príklad programu pre viacúrovňovú dedičnosť.
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ýkon:
Presný reťazec sme naprogramovali vyššie. Potom v hlavnej metóde vytvoríme objekt triedy C. Objekt triedy C potom môže pristupovať k metódam svojho rodiča B aj starého rodiča A.
Hierarchická dedičnosť v Jave
Trieda môže mať od seba odvodených viac ako jednu triedu. Máme teda jednu základňu alebo nadtriedu a viac ako jednu podtriedu. Tento typ dedičstva sa nazýva „hierarchické dedičstvo“.
Hierarchická dedičnosť je schematicky znázornená nižšie:
Ako príklad hierarchického dedičstva môžeme predstaviť triedu zvierat ako nadtriedu a potom z nej odvodiť viac ako jedno zviera, napríklad mačku, psa, kravu atď.
Nižšie uvedený program Java demonštruje hierarchickú dedičnosť v prostredí 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 } }
Výkon:
Ako vidíme z programu, máme rodičovskú triedu a tri podradené triedy odvodené od tohto rodiča. V hlavnej metóde vytvoríme objekt každej z podradených tried a zavoláme ich príslušné členské metódy.
Pri volaní metód nadradenej triedy si uvedomte, že môžeme použiť ktorýkoľvek z objektov podradenej triedy, pretože všetky majú prístup k nadradenej triede.
Viacnásobné dedenie v Jave
Viacnásobné dedičstvo je situácia, v ktorej môže jedna trieda dediť z viac ako jednej triedy, t. J. Jedna trieda môže mať viac ako jedného rodiča. Týmto spôsobom môže mať trieda viac ako jednu nadtriedu a získať tak vlastnosti a správanie všetkých svojich nadtried.
Schematické znázornenie viacnásobnej dedičnosti je uvedené nižšie:
Ako je uvedené vyššie, môžeme odvodiť triedu z viac ako jednej triedy súčasne. Takto odvodená trieda získa vlastnosti všetkých svojich nadradených tried. To môže viesť k vážnym nejasnostiam, najmä ak sú zdedené znaky rovnaké.
Poznámka:Java nepodporuje viacnásobné dedenie pomocou tried. Podporuje však viacnásobné dedenie pomocou rozhraní, o ktorých si povieme v našom ďalšom návode na dedenie.
Pretože Java nepodporuje viacnásobné dedenie s triedami, nebudeme zachádzať do podrobností. Neskôr v tomto výučbe sa však pokúsime pochopiť dôvody, ktoré stoja v pozadí Java, ktorá nepodporuje viacnásobné dedenie.
Hybridná dedičnosť v Jave
Hybridné dedičstvo je kombináciou jedného alebo viacerých typov dedičstva, o ktorých sme hovorili vyššie. Akákoľvek kombinácia však vedie k typu viacnásobného dedičstva, ktorý Java nepodporuje.
Hybridné dedičstvo je možné schematicky znázorniť nižšie.
Preto jazyk Java nepodporuje hybridné dedenie ani pri triedach. Ale rovnako ako viacnásobné dedičstvo, aj my môžeme implementovať hybridné dedičstvo v Jave pomocou rozhraní. Budeme o tom podrobne diskutovať v našom ďalšom návode.
Prečo Java nepodporuje viacnásobné dedičstvo?
Cieľom Java je jednoduchosť programov. To platí dokonca aj pre funkcie OOP. Takže pokiaľ ide o viacnásobné dedičstvo, môžu vzniknúť nejednoznačné situácie, keď odvodíme triedu z viac ako jednej triedy.
Poďme si teraz uvedomiť problémy, ktoré môžu nastať, keď máme v našom programe viacnásobné dedičstvo.
Zvážte nasledujúce systémy viacnásobného dedenia.
Ak vidíme vyššie uvedený systém, je to samozrejmé. Tu sú trieda A a trieda B dvojradové triedy zdedené triedou C. Teraz sme preukázali, že obidve triedy A a B majú metódu s rovnakým názvom, tj. Print (). Keď teda trieda C zdedí A a B, získa obidve verzie metódy print ().
V takom prípade trieda C nebude vedieť, ktorú metódu má dediť. Toto je nejednoznačná situácia, ktorú sme spomenuli vyššie a ktorá nastáva v prípade viacnásobného dedičstva.
Preto Java vydáva chybu kompilátora, keď trieda dedí z viac ako jednej triedy.
Nasledujúci program Java to preukáže.
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ýkon:
Ako je vidieť z výstupu, kompilátor Java vydá chybu, keď zistí, že trieda rozširuje dve triedy.
pokojné webové služby testujúce otázky na pohovor
Aj keď Java neumožňuje dediť súčasne dve triedy, ponúka nám cestu okolo tohto obmedzenia. Viaceré dedičstvo môžeme simulovať pomocou rozhraní namiesto tried. Budeme o tom diskutovať v nasledujúcich príručkách.
Diamond problém
Viacnásobné dedičstvo má za následok situáciu zvanú „Diamantový problém“.
Zvážte, že máme nasledujúci systém dedenia.
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 znázorniť schematicky, ako je uvedené nižšie:
Ako vidíme z vyššie uvedeného diagramu, celý systém dedenia sa javí v tvare kosoštvorca. Kvôli tejto diamantovej štruktúre sa nejednoznačnosť nazýva „Diamantový problém“.
Ako už bolo vysvetlené vyššie pre viacnásobné dedičstvo, nejednoznačnosťou je tu viacnásobný počet kópií metódy show (), ktorú trieda Sample získa v dôsledku dedičnosti. Pretože existuje viac ciest, dosahuje metódu show () a existuje nejednoznačnosť, ktorá kópia sa má dediť.
Rovnako ako pri viacnásobnom dedičstve, problém s diamantmi je možné vyriešiť aj pomocou rozhraní.
Pravidlá dedenia v Jave
Doteraz sme videli základy dedenia aj typy dedenia v Jave, vymenujme niektoré pravidlá, ktoré musíme dodržiavať pri vývoji aplikácií s dedením.
Pravidlo č. 1: Java nepodporuje viacnásobné dedenie
Ako sme už videli, Java nepodporuje viacnásobné dedenie v žiadnej podobe. Pri pokuse o viacnásobné dedičstvo v programe vydá kompilátor Java chybu kompilátora.
Pravidlo č. 2: Java nepovoľuje cyklické dedenie
Trieda, ktorá sa dedí na vytvorenie cyklu, sa nazýva cyklická dedičnosť.
Zvážte nasledujúce triedy, triedu 1 a triedu 2.
trieda class1 rozširuje triedu 2 {}
trieda class2 rozširuje triedu 1 {}
Vyššie uvedená situácia vytvára slučku. V prostredí Java to nie je povolené.
Pravidlo č. 3: Nemôžeme dediť členov súkromných údajov
V téme „Modifikátory prístupu“ sme sa už dozvedeli, že členovia so súkromným prístupom nemožno dediť.
Pravidlo č. 4: Konštruktory sa nededia
Pretože sa konštruktory používajú na vytváranie objektov triedy, nededia sa z jednej triedy na druhú.
Pravidlo č. 5: Na prístup k podradeným objektom môžeme použiť odkaz rodiča
Videli sme už rôzne príklady dedičstva. Môžeme vytvoriť odkaz na nadradenú triedu typu a potom mu priradiť odvodený objekt triedy vytvorený pomocou nového kľúčového slova.
Ak super je nadtrieda a sub je trieda odvodená od super, ako je uvedené nižšie.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Pravidlo č. 6: Rodičovské konštruktory sa vykonávajú z dôvodu super () v odvodených konštruktoroch
Jedno z pravidiel hovorí, že konštruktory nemožno dediť. Ale konštruktor nadtriedy je možné vykonať vo vnútri konštruktora odvodenej triedy pomocou volania super ().
často kladené otázky
Otázka 1) Ktorý typ dedenia nie je podporovaný v Java?
Odpoveď: Java nepodporuje viacnásobné dedenie, pretože môže spôsobiť problémy v aplikáciách, ako je diamantový problém. Java tiež nepodporuje hybridné dedičstvo, pretože je kombináciou jedného alebo viacerých typov dedičstva a nakoniec sa môže zmeniť na viacnásobné dedičstvo.
Otázka č. 2) Ktorí z členov triedy sa môžu dediť?
Odpoveď: Trieda môže dediť verejných a chránených členov svojej základnej triedy, ale nemôže získať prístup k súkromným členom základnej triedy.
Otázka č. 3) Prečo nie je povolené viacnásobné dedenie?
Odpoveď: Viacnásobné dedičstvo vedie k nejednoznačnosti, keď majú triedy s dvoma rodičmi metódy s rovnakým prototypom. V tomto prípade odvodená trieda čelí nejasnostiam, pokiaľ ide o to, od ktorej základnej triedy by mala metódu dediť.
Viacnásobné dedičstvo môže tiež spôsobiť problém s diamantmi v Jave. Java preto nepodporuje viacnásobné dedenie.
Otázka č. 4) Prečo potrebujete viacnásobné dedičstvo?
Odpoveď: Jazyky ako Java a C # vynucujú viacnásobné dedičstvo pomocou viacerých rozhraní. Takže keď potrebujeme dediť vlastnosti z viac ako jedného rozhrania, potrebujeme viacnásobné dedenie.
Otázka č. 5) Aké je hlavné využitie viacúrovňovej dedičnosti?
Odpoveď: O triede odvodenej z inej triedy, ktorá je zase odvodená z tretej triedy, sa hovorí, že vykazuje viacúrovňové dedičstvo. Úrovne v tomto type dedičstva možno rozšíriť na ľubovoľný počet, pokiaľ je to zachované zrozumiteľnosť a jednoduchosť.
Pomocou viacúrovňovej dedičnosti môžeme vykresliť rôzne úrovne druhov. Z programového hľadiska, keď chceme reprezentovať rôzne úrovne aplikačných tried, ideme na viacúrovňové dedenie.
Záver
V tomto tutoriáli sme diskutovali o typoch dedenia v Jave. Java podporuje iba jednotlivé, viacúrovňové a hierarchické typy dedenia. Java nepodporuje viacnásobné a hybridné dedičstvo. Diskutovali sme o nejednoznačnosti viacerých dedičstiev a probléme diamantu v Jave.
Potom sme diskutovali o rôznych pravidlách, ktoré by sme mali dodržiavať pri implementácii dedičstva v Jave. Týmto sme zavŕšili našu diskusiu o vzťahu IS-A v Jave.
=> Dajte si pozor na jednoduchú sériu školení Java tu.
Odporúčané čítanie
- Čo je dedenie v prostredí Java - návod s príkladmi
- Dedenie v C ++
- Typy dedenia v C ++
- Základy jazyka Java: Java Syntax, trieda Java a základné koncepty Java
- Celé číslo Java a trieda Java BigInteger s príkladmi
- Typy tried v prostredí Java: abstraktné, konkrétne, konečné, statické
- Premenné Java a ich typy s príkladmi
- Výukový program triedy skenerov Java s príkladmi