types inheritance java single vs multiple inheritance
Lær alt om de forskellige typer arv i Java ved hjælp af enkle eksempler. Find ud af om Java understøtter flere arv:
Vi introducerede arv i Java sammen med de forskellige grundlæggende begreber relateret til arv til læserne i vores sidste vejledning.
I denne vejledning vil vi udforske yderligere i arveemnet og lære mere om arvetyperne.
=> Tjek ALLE Java-tutorials her.
forretningsanalytiker tekniske interview spørgsmål og svar
Hvad du vil lære:
Typer af arv i Java
Afhængig af den måde, klasserne arves på, og hvor mange klasser, der arves, har vi følgende arvetyper som vist i nedenstående figur.
Som vist i ovenstående figur er der fem typer arv i objektorienteret programmering som beskrevet nedenfor:
# 1) Enkelt arv: Når en afledt klasse eller underklasse kun arver fra en base eller superklasse, er det en enkelt arv.
# 2) Arvelighed på flere niveauer: I Multilevel Arv har vi mere end et niveau, hvor en klasse arver fra en basisklasse, og den afledte klasse til gengæld arves af en anden klasse.
# 3) Hierarkisk arv: Et arvshierarki dannes i denne type arv, når en superklasse arves af mere end en klasse.
# 4) Flere arv: Flere arv er den, hvor en klasse kan arve egenskaber og adfærd fra mere end en forælder.
# 5) Hybrid arv: Når en eller flere typer arv kombineres, bliver det en hybrid arv.
Bemærk, at Java kun understøtter en enkelt, flere niveauer og hierarkisk type arv ved hjælp af klasser. Java understøtter ikke flere og hybrid arv med klasser.
Nu vil vi diskutere hver type arv i detaljer med programmeringseksempler.
Enkelt arv i Java
En enkelt arv er afbildet som vist nedenfor:
Her arver en underklasse fra en enkelt superklasse. Dette er en enkelt arv. Ethvert dyr som hund arver fra dyrearten. Dette er den enkleste form for arv.
Nedenfor er et Java-program, der forklarer 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:
Her har vi en metode til at spise (Action_eat) i basisklassen Animal, som er fælles for dyrearter. Vi har en afledt klasse Hund, der stammer fra dyreklassen. I hundeklassen har vi en metode, der er specifik for hundearter, bark (Action_bark).
Derefter opretter vi et hundeobjekt i hovedmetoden, og da hundeklassen har arvet dyreklassen, kan dette objekt kalde spise såvel som barkmetode.
Multilevel arv i Java
I arv på flere niveauer har vi en kæde af arv. Dette betyder, at vi har en overordnet klasse, der arves af en afledt klasse. Afledt klasse fungerer igen som forælder til en anden klasse og så videre.
Arven på flere niveauer kan repræsenteres som nedenfor:
Som det ses i ovenstående figur er der en overordnet klasse A. Klasse B arver fra klasse A. Derefter er der en anden klasse C, der igen arver fra klasse B. Således kan vi se, at den danner en arvekæde. Her bliver klasse B en mellemklasse, der forbinder klasse A og C.
Fortsat med vores eksempel på dyreklasser nedenfor, kan vi få en hundeklasse afledt af dyreklassen. Så kan vi have en anden klasse hvalp, som er en babyhund, der stammer fra hundeklassen. På denne måde kan vi have arven på flere niveauer.
Et eksempel på et program til multilevel arv er vist nedenfor.
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 programmeret den nøjagtige kæde vist ovenfor. Derefter opretter vi i hovedmetoden et objekt i klasse C. Klass C-objektet kan derefter få adgang til metoderne til dets overordnede B såvel som bedsteforældre A.
Hierarkisk arv i Java
En klasse kan have mere end en klasse afledt af den. Så vi har en base eller superklasse og mere end en underklasse. Denne type arv kaldes “Hierarkisk arv”.
Den hierarkiske arv er diagrammatisk vist nedenfor:
Som et eksempel på hierarkisk arv kan vi repræsentere dyreklassen som en superklasse og derefter have mere end et dyr som kat, hund, ko osv. Afledt af den.
Java-programmet nedenfor viser den hierarkiske arv 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 fra programmet har vi en forældreklasse og tre børneklasser afledt af denne forælder. I hovedmetoden opretter vi et objekt for hver af barneklasser og kalder deres respektive medlemsmetoder.
For at kalde metoderne i forældreklassen skal du bemærke, at vi kan bruge et hvilket som helst af underordnede klasseobjekter, da alle har adgang til overordnede klassen.
Flere arv i Java
Flere arv er en situation, hvor en klasse kan arve fra mere end en klasse, dvs. en klasse kan have mere end en forælder. Ved at gøre dette kan klassen have mere end en superklasse og således erhverve egenskaberne og opførelsen af alle dens superklasser.
Den diagrammatiske gengivelse af multipel arv er vist nedenfor:
Som vist ovenfor kan vi udlede en klasse fra mere end en klasse samtidigt. På den måde får den afledte klasse funktionerne i alle dens overordnede klasser. Dette kan give anledning til alvorlige uklarheder, især når de arvede funktioner er de samme.
Bemærk:Java understøtter ikke flere arv ved hjælp af klasser. Men det understøtter flere arv ved hjælp af grænseflader, som vi vil diskutere i vores næste tutorial om arv.
Da Java ikke understøtter flere arv med klasser, går vi ikke i detaljerne. Senere i vejledningen vil vi dog forsøge at forstå årsagerne til Java, der ikke understøtter flere arv.
Hybrid arv i Java
Hybrid arv er en kombination af en eller flere typer arv, som vi har diskuteret ovenfor. Enhver kombination resulterer dog i en type multipel arv, der ikke understøttes af Java.
En hybrid arv kan diagrammatisk vises som nedenfor.
Derfor understøtter Java heller ikke hybrid arv så godt med klasser. Men som flere arv kan vi implementere hybrid arv i Java ved hjælp af grænseflader. Vi vil diskutere dette detaljeret i vores næste vejledning.
Hvorfor understøtter Java ikke flere arv?
Java sigter mod enkelhed i programmer. Dette gælder selv for OOP-funktioner. Så når det kommer til flere arv, kan der opstå nogle tvetydige situationer, når vi udleder en klasse fra mere end en klasse.
Lad os nu forstå de problemer, der kan opstå, når vi har flere arv i vores program.
Overvej følgende flere arvssystemer.
Hvis vi ser ovenstående system, forklarer det sig selv. Her er klasse A og klasse B to-overordnede klasser arvet af klasse C. Nu har vi vist, at både klasse A og B har en metode med samme navn, dvs. print (). Så når klasse C arver A og B, får den begge versionerne af print () -metoden.
I dette tilfælde ved klasse C ikke, hvilken metode den skal arve. Dette er den tvetydige situation, vi nævnte ovenfor, der opstår i tilfælde af multipel arv.
Derfor udsteder Java en compiler-fejl, når klassen arver fra mere end en klasse.
Det følgende Java-program demonstrerer dette.
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 det ses fra output, udsender Java-compileren en fejl, når den finder ud af, at klassen udvider to klasser.
Selvom Java ikke tillader, at to klasser arves samtidigt, giver det os en vej rundt denne begrænsning. Vi kan simulere flere arv ved hjælp af grænseflader i stedet for klasser. Vi vil diskutere dette i vores efterfølgende tutorials.
Diamantproblem
Flere arv resulterer i en situation kaldet “Diamond problem”.
Overvej at vi har følgende arvesystem.
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 repræsentere dette system diagrammatisk som vist nedenfor:
Som vi kan se fra ovenstående diagram, vises hele arvesystemet i en diamantform. På grund af denne diamantstruktur kaldes tvetydigheden 'Diamantproblemet'.
Som tidligere forklaret for multipel arv er tvetydigheden her det mange antal kopier af show () -metoden, som prøveklassen opnår som et resultat af arv. Da der er flere stier, opnås metoden show (), og der er en tvetydighed om, hvilken kopi der skal arves.
Som med flere arv kan diamantproblemet også løses ved hjælp af grænseflader.
Arvelegler i Java
Indtil nu har vi set det grundlæggende i arv såvel som arvetyperne i Java, lad os liste nogle regler, som vi skal følge, mens vi udvikler applikationer med arv.
Regel nr. 1: Java understøtter ikke flere arv
Som vi allerede har set, understøtter Java ikke flere arv i nogen form. Når der forsøges flere arv i et program, udsteder Java-compileren kompilatorfejl.
Regel nr. 2: Java tillader ikke cyklisk arv
En klasse, der arver sig selv til at danne en cyklus, kaldes cyklisk arv.
Overvej følgende klasser, klasse1 og klasse2.
klasse klasse1 udvider klasse 2 {}
oprette et nyt java-projekt i formørkelse
klasse klasse2 udvider klasse 1 {}
Ovenstående situation danner en løkke. Dette er ikke tilladt i Java.
Regel nr. 3: Vi kan ikke arve private datamedlemmer
Vi har allerede lært i emnet 'Adgangsmodifikatorer', at medlemmer med privat adgang ikke kan arves.
Regel nr. 4: Konstruktører arves ikke
Da konstruktører bruges til at skabe klasseobjekter, arves de ikke fra en klasse til en anden.
Regel nr. 5: Vi kan bruge forældrehenvisning til at få adgang til underordnede objekter
Vi har allerede set forskellige eksempler på arv. Vi kan oprette en reference til typen overordnet klasse og derefter tildele den et afledt klasseobjekt oprettet ved hjælp af det nye nøgleord.
Hvis super er en superklasse og sub er klasse afledt af super som vist nedenfor.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Regel nr. 6: Forældrekonstruktører udføres på grund af super () i afledte konstruktører
En af reglerne siger, at konstruktører ikke kan arves. Men superklassens konstruktør kan udføres inde i konstruktøren af den afledte klasse ved hjælp af super () -opkald.
Ofte stillede spørgsmål
Q # 1) Hvilken type arv understøttes ikke af Java?
Svar: Java understøtter ikke flere arv, da det kan give anledning til problemer i applikationer som diamantproblemet. Java understøtter heller ikke hybrid arv, da det er en kombination af en eller flere arvstyper og i sidste ende kan blive til flere arv.
Spørgsmål nr. 2) Hvilke af klassens medlemmer kan arves?
Svar: En klasse kan arve offentlige og beskyttede medlemmer af sin basisklasse, men kan ikke få adgang til de private medlemmer af basisklassen.
Spørgsmål nr. 3) Hvorfor er flere arv ikke tilladt?
Svar: Flere arv resulterer i tvetydighed, når to-forældreklasser har metoder med samme prototype. I dette tilfælde står den afledte klasse over for en uklarhed om, fra hvilken basisklasse den skal arve metoden.
Flere arv kan også resultere i et diamantproblem i Java. Derfor understøtter Java ikke flere arv.
Spørgsmål nr. 4) Hvorfor har du brug for flere arv?
Svar: Sprog som Java og C # håndhæver flere arv ved hjælp af flere grænseflader. Så når vi har brug for at arve funktioner fra mere end en grænseflade, så har vi brug for flere arv.
Spørgsmål nr. 5) Hvad er den største brug af multilevel arv?
Svar: En klasse afledt af en anden klasse, som igen er afledt af en tredje klasse siges at udvise arv på flere niveauer. Niveauerne i denne type arv kan udvides til et hvilket som helst tal, så længe det opretholder klarhed og enkelhed.
Vi kan skildre forskellige niveauer af arter ved hjælp af arv på flere niveauer. Fra programmeringsmæssigt synspunkt, når vi vil repræsentere forskellige niveauer af applikationsklasser, så går vi til arv på flere niveauer.
Konklusion
I denne vejledning har vi diskuteret arvetyperne i Java. Java understøtter kun enkelt-, multilevel- og hierarkiske typer arv. Java understøtter ikke flere og hybride arv. Vi har diskuteret Multiple arv-tvetydighed og Diamond-problemet i Java.
Derefter diskuterede vi de forskellige regler, som vi skulle følge, når vi implementerede arv i Java. Med dette har vi afsluttet vores diskussion om IS-A-forholdet i Java.
=> Hold øje med den enkle Java-træningsserie her.
Anbefalet læsning
- Hvad er arv i Java - Vejledning med eksempler
- Arv i C ++
- Typer af arv i C ++
- Java Basics: Java Syntax, Java Class og Core Java Concepts
- Java-heltal og Java BigInteger-klasse med eksempler
- Typer af klasser i Java: Abstrakt, Beton, Endelig, Statisk
- Java-variabler og deres typer med eksempler
- Java Scanner-klassevejledning med eksempler