types inheritance java single vs multiple inheritance
S pomočjo preprostih primerov se naučite vsega o različnih vrstah dedovanja v Javi. Ugotovite, ali Java podpira večkratno dedovanje:
V zadnji vadnici smo bralcem predstavili dedovanje v Javi in različne osnovne koncepte, povezane z dedovanjem.
V tej vadnici bomo podrobneje preučili temo dedovanja in izvedeli več o vrstah dedovanja.
=> Tukaj preverite VSE Vadnice za Java.
Vprašanja in odgovori za razgovore v zbirki podatkov sql
Kaj se boste naučili:
Vrste dedovanja v Javi
Glede na način podedovanja razredov in število podedovanih razredov imamo naslednje vrste dedovanja, kot je prikazano na spodnji sliki.
Kot je prikazano na zgornji sliki, obstaja pet vrst dedovanja v objektno usmerjenem programiranju, kot je opisano spodaj:
# 1) Enkratno dedovanje: Ko izpeljani razred ali podrazred podeduje samo eno osnovo ali superrazred, gre za enojno dedovanje.
# 2) Dedovanje na več ravneh: V večnivojski dedovanju imamo več kot eno raven, pri kateri razred podeduje osnovni razred, izpeljani razred pa podeduje drug razred.
# 3) Hierarhično dedovanje: Pri tej vrsti dedovanja se oblikuje dedna hierarhija, kadar nadrazred podeduje več kot en razred.
# 4) Večkratno dedovanje: Večkratno dedovanje je tisto, pri katerem lahko razred podeduje lastnosti in vedenje več kot enega starša.
# 5) Hibridno dedovanje: Ko se kombinira ena ali več vrst dedovanja, postane hibridna dediščina.
Upoštevajte, da Java podpira samo enojno, večnivojsko in hierarhično vrsto dedovanja z uporabo razredov. Java ne podpira večkratnega in hibridnega dedovanja z razredi.
Zdaj bomo podrobno razpravljali o vsaki vrsti dedovanja s primeri programiranja.
Eno dedovanje v Javi
Posamezna dediščina je prikazana, kot je prikazano spodaj:
Tu podrazred podeduje en sam superrazred. To je eno dedovanje. Katera koli žival, kot je pes, podeduje od živalske vrste. To je najpreprostejša oblika dedovanja.
Spodaj je program Java, ki pojasnjuje 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 } }
Izhod:
Tu imamo en način prehranjevanja (Action_eat) v osnovnem razredu Žival, ki je skupen živalskim vrstam. Imamo izpeljani razred pes, ki izhaja iz razreda živali. V razredu psov imamo metodo, ki je značilna za pasje vrste, lubje (Action_bark).
Nato v glavni metodi ustvarimo objekt Dog in ker je razred Dog podedoval razred Animal, lahko ta objekt pokliče tudi eat in bark.
Večstopenjsko dedovanje v Javi
Pri večstopenjskem dedovanju imamo dedno verigo. To pomeni, da imamo nadrejeni razred, ki ga podeduje izvedeni razred. Izpeljani razred pa deluje kot nadrejeni drugemu razredu itd.
Dediščino na več ravneh lahko predstavimo kot spodaj:
Kot je razvidno na zgornji sliki, obstaja nadrejeni razred A. Razred B podeduje iz razreda A. Potem obstaja še en razred C, ki pa podeduje iz razreda B. Tako lahko vidimo, da tvori verigo dedovanja. Tu razred B postane posredniški razred, ki povezuje razreda A in C.
Če nadaljujemo s spodnjim primerom razreda živali, lahko dobimo razred psov, ki izhaja iz razreda živali. Potem lahko dobimo še en razred Puppy, ki je otroški pes, pridobljen iz razreda Dog. Tako lahko dobimo dediščino na več ravneh.
Primer programa za večstopenjsko dedovanje je prikazan spodaj.
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 } }
Izhod:
Programirali smo natančno prikazano verigo zgoraj. Nato v glavni metodi ustvarimo objekt razreda C. Predmet razreda C lahko nato dostopa do metod svojega nadrejenega B in starih staršev A.
Hierarhično dedovanje v Javi
Razred lahko iz njega izpelje več razredov. Tako imamo eno osnovno ali nadrazred in več podrazredov. Ta vrsta dedovanja se imenuje »hierarhična dediščina«.
Hierarhično dedovanje je shematsko predstavljeno spodaj:
Kot primer hierarhične dediščine lahko predstavimo razred živali kot nadrazred in iz njega izpeljemo več živali, kot so mačka, pes, krava itd.
Spodnji program Java prikazuje Hierarhično dedovanje v Javi.
//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 } }
Izhod:
Kot vidimo iz programa, imamo roditeljski razred in tri podrejene razrede, ki izhajajo iz tega starša. V glavni metodi ustvarimo objekt vsakega od podrejenih razredov in pokličemo ustrezne metode članov.
Za klicanje metod nadrejenega razreda upoštevajte, da lahko uporabimo kateri koli predmet nadrejenega razreda, saj imajo vsi dostop do nadrejenega razreda.
Večkratno dedovanje v Javi
Večkratno dedovanje je situacija, v kateri lahko en razred podeduje več kot en razred, tj. En razred ima lahko več kot enega starša. S tem lahko razred ima več kot en superrazred in tako pridobi lastnosti in vedenje vseh svojih super razredov.
Diagramska predstavitev večkratne dediščine je prikazana spodaj:
Kot je prikazano zgoraj, lahko razred izpeljemo iz več kot enega razreda hkrati. Tako bo izpeljani razred pridobil lastnosti vseh svojih nadrejenih razredov. To lahko povzroči resne dvoumnosti, zlasti kadar so podedovane lastnosti enake.
Opomba:Java ne podpira večkratnega dedovanja z uporabo razredov. Podpira pa večkratno dedovanje z uporabo vmesnikov, o čemer bomo razpravljali v naslednji vadnici o dedovanju.
Ker Java ne podpira večkratnega dedovanja z razredi, se ne bomo spuščali v podrobnosti. Kasneje v vadnici pa bomo poskušali razumeti razloge, zakaj Java ne podpira večkratnega dedovanja.
Hibridno dedovanje v Javi
Hibridno dedovanje je kombinacija ene ali več vrst dediščin, o katerih smo govorili zgoraj. Katera koli kombinacija pa povzroči vrsto večkratnega dedovanja, ki ga Java ne podpira.
Hibridno dedovanje lahko shematsko predstavimo kot spodaj.
Zato Java ne podpira tudi hibridnega dedovanja z razredi. Toda tako kot večkratno dedovanje lahko tudi v Java izvedemo hibridno dedovanje z uporabo vmesnikov. O tem bomo podrobno razpravljali v naši naslednji vadnici.
Zakaj Java ne podpira večkratnega dedovanja?
Java si prizadeva za preprostost programov. To velja celo za funkcije OOP. Ko gre za večkratno dedovanje, se lahko pojavijo nekatere dvoumne situacije, ko razred izpeljemo iz več kot enega razreda.
Zdaj pa razumimo težave, ki se lahko pojavijo, če imamo v svojem programu večkratno dedovanje.
Upoštevajte naslednje sisteme večkratnega dedovanja.
Če vidimo zgornji sistem, je to samoumevno. Tu sta razred A in razred B nadrejena razreda, ki jih podeduje razred C. Zdaj smo pokazali, da imata oba razreda A in B metodo z istim imenom, tj. Print (). Torej, ko razred C podeduje A in B, bo dobil obe različici metode print ().
V tem primeru razred C ne bo vedel, katero metodo bi moral podedovati. To je dvoumna situacija, ki smo jo omenili zgoraj, ki se pojavi v primeru večkratne dediščine.
Zato Java izda napako prevajalnika, ko razred podeduje več kot en razred.
Naslednji program Java bo to prikazal.
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(); } }
Izhod:
Kot je razvidno iz izhoda, prevajalnik Java izda napako, ko ugotovi, da razred razširja dva razreda.
Čeprav Java ne dovoljuje, da se dva razreda podedujeta hkrati, nam ponuja pot k tej omejitvi. Večkratno dedovanje lahko simuliramo z uporabo vmesnikov namesto razredov. O tem bomo razpravljali v naslednjih vajah.
Diamantni problem
Večkratno dedovanje povzroči situacijo, imenovano 'Diamantni problem'.
Upoštevajte, da imamo naslednji sistem dedovanja.
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 }
Ta sistem lahko shematsko predstavimo, kot je prikazano spodaj:
Kot lahko vidimo iz zgornjega diagrama, je celoten sistem dedovanja v obliki diamanta. Zaradi te diamantne strukture je dvoumnost imenovana 'Diamantni problem'.
Kot je bilo prej pojasnjeno za večkratno dedovanje, je tukaj dvoumnost večkratno število kopij metode show (), ki ga razred Sample pridobi kot dedovanje. Ker obstaja več poti, doseže metodo show () in obstaja dvoumnost glede tega, katero kopijo podedovati.
Tako kot pri večkratnem dedovanju je tudi z diamanti težavo mogoče rešiti z vmesniki.
Pravila dedovanja v Javi
Do sedaj smo videli osnove dedovanja in vrste dedovanja v Javi, naštejmo nekaj pravil, ki jih moramo upoštevati pri razvoju aplikacij z dedovanjem.
1. pravilo: Java ne podpira večkratne dediščine
Kot smo že videli, Java ne podpira večkratnega dedovanja v kakršni koli obliki. Ko se v programu poskuša večkratno dedovanje, prevajalnik Java izda napako prevajalnika.
2. pravilo: Java ne dovoljuje cikličnega dedovanja
Razred, ki se podeduje, da tvori cikel, se imenuje ciklično dedovanje.
Upoštevajte naslednje razrede, razred1 in razred2.
razred class1 podaljša razred 2 {}
razred class2 razširja razred 1 {}
Zgornja situacija predstavlja zanko. V Javi to ni dovoljeno.
3. pravilo: Članov zasebnih podatkov ne moremo podedovati
V temi »Modifikatorji dostopa« smo že izvedeli, da članov z zasebnim dostopom ni mogoče podedovati.
Pravilo # 4: Konstruktorji se ne podedujejo
Ker se konstruktorji uporabljajo za ustvarjanje predmetov razredov, jih ne podedujejo od enega razreda do drugega.
5. pravilo: Za dostop do podrejenih predmetov lahko uporabimo referenco staršev
Videli smo že različne primere dedovanja. Ustvarimo lahko referenco tipa nadrejeni razred in mu nato dodelimo objekt izpeljanega razreda, ustvarjen z novo ključno besedo.
Če je super superrazred in je podrazred, ki izhaja iz super, kot je prikazano spodaj.
class super{} class sub extends super{ public static void main(String[] args){ super s_obj = new sub(); } }
Pravilo # 6: Nadrejeni konstruktorji se izvajajo zaradi super () v izvedenih konstruktorjih
Eno od pravil pravi, da konstruktorjev ni mogoče podedovati. Toda konstruktor superklase je mogoče izvesti znotraj konstruktorja izpeljanega razreda z uporabo klica super ().
Pogosto zastavljena vprašanja
V # 1) Katere vrste dedovanja Java ne podpira?
Odgovor: Java ne podpira večkratnega dedovanja, saj lahko povzroči težave v aplikacijah, kot je diamant. Java tudi ne podpira hibridnega dedovanja, saj gre za kombinacijo ene ali več vrst dedovanja in se na koncu lahko spremeni v več dedovanja.
V # 2) Katerega od članov razreda je mogoče podedovati?
Odgovor: Razred lahko podeduje javne in zaščitene člane osnovnega razreda, vendar ne more dostopati do zasebnih članov osnovnega razreda.
V # 3) Zakaj večkratno dedovanje ni dovoljeno?
v unixu dovoljenje za dostop w (pisanje) omogoča
Odgovor: Večkratno dedovanje povzroči dvoumnost, če imajo dvostarševski razredi metode z istim prototipom. V tem primeru se izpeljani razred sooča z dvoumnostjo glede tega, iz katerega osnovnega razreda naj podeduje metodo.
Večkratno dedovanje lahko povzroči tudi težave z diamanti v Javi. Zato Java ne podpira večkratnega dedovanja.
V # 4) Zakaj potrebujete večkratno dedovanje?
Odgovor: Jezika, kot sta Java in C #, uveljavljata večkratno dedovanje z več vmesniki. Torej, ko moramo funkcije podedovati iz več kot enega vmesnika, potem potrebujemo več dedovanja.
V # 5) Kakšna je glavna uporaba večstopenjskega dedovanja?
Odgovor: Razred, ki izhaja iz drugega razreda, ki je nato izpeljan iz tretjega razreda, naj bi imel večstopenjsko dedovanje. Stopnje pri tej vrsti dedovanja se lahko razširijo na poljubno število, če ohranjajo jasnost in preprostost.
Z večstopenjskim dedovanjem lahko prikažemo različne ravni vrst. S programskega vidika, ko želimo predstaviti različne ravni razredov aplikacij, gremo za večstopenjsko dedovanje.
Zaključek
V tej vadnici smo razpravljali o vrstah dedovanja v Javi. Java podpira samo enojne, večnivojske in hierarhične vrste dedovanja. Java ne podpira dedovanja Multiple in Hybrid. Razpravljali smo o dvoumnosti večkratnega dedovanja in diamantnem problemu v Javi.
Nato smo razpravljali o različnih pravilih, ki jih moramo upoštevati pri izvajanju dedovanja v Javi. S tem smo zaključili razpravo o odnosu IS-A v Javi.
=> Tukaj bodite pozorni na preprosto serijo Java Training Training.
Priporočeno branje
- Kaj je dedovanje v Javi - Vadnica s primeri
- Dedovanje v jeziku C ++
- Vrste dedovanja v jeziku C ++
- Osnove Java: Sintaksa Java, Razred Java in Osnovni koncepti Java
- Java Integer in Java BigInteger Class z primeri
- Vrste pouka v Javi: abstraktno, konkretno, končno, statično
- Spremenljivke Java in njihove vrste s primeri
- Vadnica razreda Java Scanner Class z primeri