types inheritance java single vs multiple inheritance
Lär dig allt om olika typer av arv i Java med hjälp av enkla exempel. Ta reda på om Java stöder flera arv:
Vi introducerade Inheritance in Java tillsammans med de olika grundläggande begreppen relaterade till arv för läsarna i vår senaste handledning.
I den här handledningen kommer vi att utforska mer om arvsmaterialet och lära oss mer om vilka typer av arv.
=> Kontrollera ALLA Java-handledning här.
vad kan jag öppna en eps-fil med
Vad du kommer att lära dig:
Typer av arv i Java
Beroende på hur klasserna ärvs och hur många klasser som ärvs, har vi följande typer av arv som visas i figuren nedan.
Som framgår av figuren ovan finns det fem typer av arv i objektorienterad programmering som beskrivs nedan:
# 1) Enstaka arv: När en härledd klass eller underklass ärver från endast en bas eller superklass är det en enda arv.
# 2) Arv på flera nivåer: I Multilevel Inheritance har vi mer än en nivå där en klass ärver från en basklass och den härledda klassen i sin tur ärvs av en annan klass.
# 3) Hierarkisk arv: En arvshierarki bildas i denna typ av arv när en superklass ärvs av mer än en klass.
# 4) Flera arv: Multipel arv är den där en klass kan ärva egenskaper och beteende från mer än en förälder.
# 5) Hybrid arv: När en eller flera typer av arv kombineras blir det en hybrid arv.
Observera att Java endast stöder enstaka, flera nivåer och hierarkiska typer av arv med hjälp av klasser. Java stöder inte multipel- och hybridärv med klasser.
Nu kommer vi att diskutera varje typ av arv i detalj med programmeringsexempel.
Enkel arv i Java
Ett enda arv visas som visas nedan:
Här ärver en underklass från en enda superklass. Detta är enstaka arv. Varje djur som hund ärver från djurarten. Detta är den enklaste formen av arv.
Nedan följer ett Java-program som förklarar Single Arv.
//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 } }
Produktion:
Här har vi en metod att äta (Action_eat) i basklass Animal som är vanligt för djurarter. Vi har en härledd klass Hund som kommer från djurklassen. I hundklassen har vi en metod som är specifik för hundarter, bark (Action_bark).
Sedan skapar vi ett hundobjekt i huvudmetoden och eftersom hundklassen har ärvt djurklassen kan det här objektet kalla såväl som barkmetod.
Arv på flera nivåer i Java
I arv på flera nivåer har vi en arvskedja. Det betyder att vi har en överordnad klass som ärvs av en härledd klass. Den härledda klassen fungerar i sin tur som förälder till en annan klass och så vidare.
Flernivåarvet kan representeras enligt nedan:
Som framgår av figuren ovan finns en överordnad klass A. Klass B ärver från klass A. Sedan finns det en annan klass C som i sin tur ärver från klass B. Således kan vi se att den bildar en kedja av arv. Här blir klass B en mellanklass som förbinder klass A och C.
Fortsatt med vårt exempel på djurklass nedan kan vi få en hundklass härledd från djurklassen. Sedan kan vi ha en annan klass Valp som är en babyhund som kommer från hundklassen. På så sätt kan vi få arvet på flera nivåer.
Ett exempel på program för Multilevel Inheritance visas nedan.
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 } }
Produktion:
Vi har programmerat den exakta kedjan som visas ovan. Sedan i huvudmetoden skapar vi ett objekt av klass C. Klass C-objektet kan då komma åt metoderna för dess förälder B såväl som morförälder A.
Hierarkisk arv i Java
En klass kan ha mer än en klass härledd från den. Så vi har en bas eller superklass och mer än en underklass. Denna typ av arv kallas ”Hierarkiskt arv”.
Den hierarkiska arvet representeras diagrammatiskt nedan:
Som ett exempel på hierarkisk arv kan vi representera djurklassen som en superklass och sedan ha mer än ett djur som katt, hund, ko etc. härledda från den.
Java-programmet nedan visar den hierarkiska arvet i 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 } }
Produktion:
Som vi ser från programmet har vi en föräldraklass och tre barnklasser härledda från denna förälder. I huvudmetoden skapar vi ett objekt för var och en av barnklasserna och kallar deras respektive medlemsmetoder.
För att anropa metoderna i föräldraklassen, notera att vi kan använda något av underordnade klassobjekt eftersom alla har tillgång till föräldraklassen.
Multipel arv i Java
Flera arv är en situation där en klass kan ärva från mer än en klass, dvs. en klass kan ha mer än en förälder. Genom att göra detta kan klassen ha mer än en superklass och därmed förvärva egenskaperna och beteendet hos alla dess superklasser.
Diagrammatisk framställning av multipel arv visas nedan:
Som visas ovan kan vi härleda en klass från mer än en klass samtidigt. På detta sätt kommer den härledda klassen att få funktionerna i alla sina överordnade klasser. Detta kan ge upphov till allvarliga tvetydigheter, särskilt när de ärvda funktionerna är desamma.
Notera:Java stöder inte flera arv med hjälp av klasser. Men det stöder flera arv med gränssnitt som vi kommer att diskutera i vår nästa handledning om arv.
Eftersom Java inte stöder flera arv med klasser kommer vi inte att gå in i detaljerna. Senare i handledningen kommer vi dock att försöka förstå orsakerna bakom Java som inte stöder flera arv.
Hybrid arv i Java
Hybridärv är en kombination av en eller flera typer av arv som vi har diskuterat ovan. Varje kombination resulterar dock i en typ av multipel arv som inte stöds av Java.
En hybridärv kan schematiskt representeras enligt nedan.
Därför stöder Java inte hybrid arv lika bra med klasser. Men som flera arv kan vi implementera hybridärv i Java med gränssnitt. Vi kommer att diskutera detta i detalj i vår nästa handledning.
Varför stöder Java inte flera arv?
Java syftar till enkelhet i program. Detta gäller även för OOP-funktioner. Så när det gäller flera arv kan vissa tvetydiga situationer uppstå när vi härleder en klass från mer än en klass.
Låt oss nu förstå de problem som kan uppstå när vi har flera arv i vårt program.
Tänk på följande flera arvssystem.
Om vi ser ovanstående system är det självförklarande. Här är klass A och klass B tvåföräldraklasser som ärvs av klass C. Nu har vi visat att både klasserna A och B har en metod med samma namn, dvs. tryck (). Så när klass C ärver A och B, kommer den att få båda versionerna av print () -metoden.
I det här fallet vet inte klass C vilken metod den ska ärva. Detta är den tvetydiga situation som vi nämnde ovan som uppstår vid multipel arv.
Därför utfärdar Java ett kompileringsfel när klassen ärver från mer än en klass.
Följande Java-program kommer att demonstrera detta.
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(); } }
Produktion:
Som framgår av utdata utfärdar Java-kompilatorn ett fel när den upptäcker att klassen utvidgar två klasser.
Även om Java inte tillåter att två klasser ärvs samtidigt, erbjuder det oss en väg runt denna begränsning. Vi kan simulera flera arv med gränssnitt istället för klasser. Vi kommer att diskutera detta i våra efterföljande handledning.
Diamantproblem
Flera arv resulterar i en situation som kallas 'Diamond problem'.
Tänk på att vi har följande arvssystem.
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 }
Vi kan representera detta system schematiskt enligt nedan:
vilka program kan öppna eps-filer
Som vi kan se från ovanstående diagram visas hela arvssystemet i en diamantform. På grund av denna diamantstruktur heter tvetydigheten 'Diamond Problem'.
Som förklarats tidigare för multipel arv är tvetydigheten här det multipla antalet kopior av show () -metoden som provklassen får som ett resultat av arv. Eftersom det finns flera vägar uppnås show () -metoden och det finns en tvetydighet angående vilken kopia som ska ärvas.
Som med flera arv kan diamantproblemet också lösas med gränssnitt.
Arvsregler i Java
Hittills har vi sett grunderna i arv såväl som typerna av arv i Java, låt oss lista några regler som vi måste följa när vi utvecklar applikationer med arv.
Regel nr 1: Java stöder inte multipel arv
Som vi redan har sett stöder Java inte flera arv i någon form. När flera arv försöks i ett program utfärdar Java-kompilatorn kompileringsfel.
Regel nr 2: Java tillåter inte cyklisk arv
En klass som ärver sig för att bilda en cykel kallas cyklisk arv.
Tänk på följande klasser, klass1 och klass2.
klass klass1 utökar klass 2 {}
klass klass2 utökar klass 1 {}
Ovanstående situation bildar en slinga. Detta är inte tillåtet i Java.
Regel 3: Vi kan inte ärva privata datamedlemmar
Vi har redan lärt oss i avsnittet 'Access modifiers' att medlemmar med privat åtkomst inte kan ärvas.
Regel nr 4: Konstruktörer ärvs inte
Eftersom konstruktörer används för att skapa klassobjekt ärvs de inte från en klass till en annan.
Regel 5: Vi kan använda föräldrarreferens för att komma åt underordnade objekt
Vi har redan sett olika exempel på arv. Vi kan skapa en referens för typ förälderklass och sedan tilldela den ett härledt klassobjekt som skapats med det nya nyckelordet.
Om super är en superklass och sub är klass härledd från super som visas nedan.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Regel 6: Föräldrakonstruktörer körs på grund av super () i härledda konstruktörer
En av reglerna anger att konstruktörer inte kan ärva. Men superklassens konstruktör kan köras inuti konstruktorn för den härledda klassen med super () -anrop.
Vanliga frågor
F # 1) Vilken typ av arv stöds inte av Java?
Svar: Java stöder inte flera arv eftersom det kan ge upphov till problem i applikationer som diamantproblemet. Java stöder inte heller hybridarv eftersom det är en kombination av en eller flera arvstyper och i slutändan kan förvandlas till flera arv.
F # 2) Vilken av medlemmarna i klassen kan ärvas?
Svar: En klass kan ärva offentliga och skyddade medlemmar i sin basklass men kan inte komma åt de privata medlemmarna i basklassen.
F # 3) Varför är flera arv inte tillåtna?
Svar: Flera arv resulterar i tvetydighet när tvåförälderklasser har metoder med samma prototyp. I det här fallet möter den härledda klassen en tvetydighet angående vilken basklass som den ska ärva metoden.
Flera arv kan också resultera i ett diamantproblem i Java. Därför stöder Java inte flera arv.
F # 4) Varför behöver du flera arv?
Svar: Språk som Java och C # verkställer flera arv med flera gränssnitt. Så när vi behöver ärva funktioner från mer än ett gränssnitt behöver vi flera arv.
F # 5) Vad är den största användningen av Multilevel Arv?
Svar: En klass härledd från en annan klass som i sin tur härleds från en tredje klass sägs uppvisa arv på flera nivåer. Nivåerna i denna typ av arv kan utökas till valfritt antal så länge det bibehåller tydlighet och enkelhet.
Vi kan skildra olika nivåer av arter med hjälp av arv på flera nivåer. Ur programmeringssynpunkt, när vi vill representera olika nivåer av applikationsklasser, går vi för flernivåarv.
Slutsats
I den här handledningen har vi diskuterat de typer av arv i Java. Java stöder endast enstaka, flera nivåer och hierarkiska typer av arv. Java stöder inte Multiple och Hybrid-arv. Vi har diskuterat Multiple inheritance ambiguity och Diamond-problemet i Java.
Sedan diskuterade vi de olika regler som vi bör följa när vi implementerar arv i Java. Med detta har vi avslutat vår diskussion om IS-A-förhållandet i Java.
=> Se upp den enkla Java-träningsserien här.
Rekommenderad läsning
- Vad är arv i Java - Handledning med exempel
- Arv i C ++
- Typer av arv i C ++
- Java Basics: Java Syntax, Java Class och Core Java Concepts
- Java-heltal och Java BigInteger-klass med exempel
- Typer av klasser i Java: Abstrakt, Betong, Slutlig, Statisk
- Java-variabler och deras typer med exempel
- Java Scanner-klasshandledning med exempel