types inheritance java single vs multiple inheritance
Leer alles over de verschillende soorten overerving in Java met behulp van eenvoudige voorbeelden. Ontdek of Java meerdere overerving ondersteunt:
We hebben Inheritance in Java geïntroduceerd, samen met de verschillende basisconcepten met betrekking tot overerving voor de lezers in onze laatste tutorial.
In deze zelfstudie gaan we dieper in op het onderwerp overerving en leren we meer over de soorten overerving.
Bekijk hier ALLE Java-tutorials.
hoe int array in java te sorteren
Wat je leert:
Soorten overerving in Java
Afhankelijk van de manier waarop de klassen worden overgeërfd en hoeveel klassen worden overgeërfd, hebben we de volgende soorten overerving, zoals weergegeven in de onderstaande afbeelding.
Zoals weergegeven in de bovenstaande afbeelding, zijn er vijf soorten overervingen in objectgeoriënteerd programmeren, zoals hieronder wordt beschreven:
# 1) Enkele erfenis: Wanneer een afgeleide klasse of subklasse erft van slechts één basis- of superklasse, is het een enkele overerving.
# 2) Overerving op meerdere niveaus: In Overerving op meerdere niveaus hebben we meer dan één niveau waarin een klasse erft van een basisklasse en de afgeleide klasse op zijn beurt wordt geërfd door een andere klasse.
# 3) Hiërarchische overerving: Een overervingshiërarchie wordt gevormd in dit type overerving wanneer een superklasse wordt overgeërfd door meer dan één klasse.
# 4) Meervoudige overerving: Meervoudige overerving is de overerving waarbij een klasse eigenschappen en gedrag van meer dan één ouder kan erven.
# 5) Hybride overerving: Wanneer een of meer soorten overerving worden gecombineerd, wordt het een hybride overerving.
Merk op dat Java alleen overerving met enkele, meervoudige en hiërarchische typen ondersteunt met behulp van klassen. Java ondersteunt geen meervoudige en hybride overerving met klassen.
Nu zullen we elk type overerving in detail bespreken met programmeervoorbeelden.
Enkele erfenis in Java
Een enkele overerving wordt weergegeven zoals hieronder weergegeven:
Hier erft een subklasse van een enkele superklasse. Dit is een eenmalige overerving. Elk dier zoals de hond erft van de diersoort. Dit is de eenvoudigste vorm van overerving.
Hieronder wordt een Java-programma gegeven dat Single Inheritance uitlegt.
Uitgang:
Hier hebben we één methode eat (Action_eat) in de basisklasse Animal die veel voorkomt bij diersoorten. We hebben een afgeleide klasse Hond die is afgeleid van Dierklasse. In de Dog-klasse hebben we een methode die specifiek is voor hondensoorten, blaffen (Action_bark).
Vervolgens maken we een Dog-object in de hoofdmethode en aangezien de Dog-klasse de Animal-klasse heeft geërfd, kan dit object zowel eat als bark-methode aanroepen.
Overerving op meerdere niveaus in Java
Bij overerving op meerdere niveaus hebben we een overervingsketen. Dit betekent dat we een bovenliggende klasse hebben die wordt overgenomen door een afgeleide klasse. Afgeleide klas fungeert op zijn beurt als een ouder voor een andere klas, enzovoort.
De overerving op meerdere niveaus kan als volgt worden weergegeven:
Zoals te zien is in de bovenstaande afbeelding is er een bovenliggende klasse A. Klasse B erft van klasse A. Dan is er nog een klasse C die op zijn beurt erft van klasse B. We kunnen dus zien dat het een keten van overerving vormt. Hier wordt klasse B een tussenklasse die de klassen A en C verbindt.
Als we doorgaan met ons voorbeeld van de dierenklasse hieronder, kunnen we een hondenklasse hebben die is afgeleid van de dierenklasse. Dan kunnen we een andere klasse Puppy hebben, een babyhond uit de hondenklasse. Op deze manier kunnen we de overerving op meerdere niveaus hebben.
Een voorbeeldprogramma voor overerving op meerdere niveaus wordt hieronder weergegeven.
Uitgang:
We hebben de exacte ketting zoals hierboven weergegeven geprogrammeerd. Vervolgens maken we in de hoofdmethode een object van klasse C.Het klasse C-object heeft dan toegang tot de methoden van zijn ouder B en grootouder A.
Hiërarchische overerving in Java
Een klasse kan meer dan één klasse hebben die ervan is afgeleid. We hebben dus één basis- of superklasse en meer dan één subklassen. Dit type overerving wordt 'hiërarchische overerving' genoemd.
De hiërarchische overerving wordt hieronder schematisch weergegeven:
Als voorbeeld van hiërarchische overerving kunnen we de klasse van dieren voorstellen als een superklasse en er vervolgens meer dan één dier, zoals kat, hond, koe, enz., Van hebben afgeleid.
Het onderstaande Java-programma demonstreert de hiërarchische overerving in Java.
Uitgang:
Zoals we uit het programma kunnen zien, hebben we een bovenliggende klasse en drie onderliggende klassen die van deze ouder zijn afgeleid. In de hoofdmethode maken we een object van elk van de onderliggende klassen en roepen we hun respectievelijke lidmethoden aan.
Houd er bij het aanroepen van de methoden van de bovenliggende klasse rekening mee dat we elk van de onderliggende klasseobjecten kunnen gebruiken, aangezien ze allemaal toegang hebben tot de bovenliggende klasse.
Meerdere overerving in Java
Meervoudige overerving is een situatie waarin één klasse kan erven van meer dan één klasse, d.w.z. één klasse kan meer dan één ouder hebben. Door dit te doen, kan de klasse meer dan één superklasse hebben en zo de eigenschappen en het gedrag van al zijn superklassen verwerven.
De schematische weergave van meervoudige overerving wordt hieronder weergegeven:
Zoals hierboven is aangetoond, kunnen we een klasse uit meer dan één klasse tegelijk afleiden. Op deze manier krijgt de afgeleide klasse de kenmerken van al zijn bovenliggende klassen. Dit kan tot ernstige onduidelijkheden leiden, vooral wanneer de geërfde kenmerken dezelfde zijn.
Opmerking:Java ondersteunt geen meervoudige overerving met behulp van klassen. Maar het ondersteunt meerdere overerving met behulp van interfaces die we zullen bespreken in onze volgende tutorial over overerving.
Omdat Java geen ondersteuning biedt voor meervoudige overerving met klassen, zullen we niet op de details ingaan. Later in de tutorial zullen we echter proberen de redenen te achterhalen waarom Java geen ondersteuning biedt voor meervoudige overerving.
Hybride overerving in Java
Hybride overerving is een combinatie van een of meer soorten overervingen die we hierboven hebben besproken. Elke combinatie resulteert echter in een type van meervoudige overerving dat niet wordt ondersteund door Java.
Een hybride overerving kan schematisch worden weergegeven zoals hieronder.
Daarom ondersteunt Java ook geen hybride overerving met klassen. Maar net als meervoudige overerving kunnen we hybride overerving in Java implementeren met behulp van interfaces. We zullen dit in onze volgende tutorial in detail bespreken.
Waarom ondersteunt Java geen meervoudige overerving?
Java streeft naar eenvoud in programma's. Dit geldt zelfs voor OOP-functies. Dus als het gaat om meervoudige overerving, kunnen er enkele dubbelzinnige situaties ontstaan wanneer we een klasse afleiden uit meer dan één klasse.
Laten we nu eens kijken naar de problemen die kunnen optreden als we meerdere overervingen in ons programma hebben.
Beschouw de volgende systemen voor meervoudige overerving.
Als we het bovenstaande systeem zien, spreekt het voor zich. Hier zijn klasse A en klasse B twee-ouderklassen die zijn overgeërfd door klasse C. Nu hebben we aangetoond dat zowel de klassen A als B een methode hebben met dezelfde naam, d.w.z. print (). Dus als klasse C A en B erft, krijgt het beide versies van de methode print ().
In dit geval weet klasse C niet welke methode het zou moeten erven. Dit is de dubbelzinnige situatie die we hierboven noemden die zich voordoet in het geval van meervoudige overerving.
Daarom geeft Java een compilatiefout af wanneer de klasse erft van meer dan één klasse.
Het volgende Java-programma zal dit demonstreren.
Uitgang:
Zoals blijkt uit de uitvoer, geeft de Java-compiler een foutmelding wanneer deze constateert dat de klasse twee klassen uitbreidt.
Hoewel Java niet toestaat dat twee klassen gelijktijdig worden overgenomen, biedt het ons een manier om deze beperking te omzeilen. We kunnen meerdere overerving simuleren met behulp van interfaces in plaats van klassen. We zullen dit in onze volgende tutorials bespreken.
Diamond probleem
Meervoudige overerving resulteert in een situatie die 'diamantprobleem' wordt genoemd.
Bedenk dat we het volgende overervingssysteem hebben.
We kunnen dit systeem schematisch weergeven zoals hieronder weergegeven:
Zoals we kunnen zien in het bovenstaande diagram, verschijnt het hele overervingssysteem in een ruitvorm. Vanwege deze diamantstructuur wordt de ambiguïteit het 'diamantprobleem' genoemd.
Zoals eerder uitgelegd voor meervoudige overerving, is de dubbelzinnigheid hier het meervoudige aantal kopieën van de methode show () dat de klasse Sample verkrijgt als resultaat van overerving. Aangezien er meerdere paden zijn, wordt de methode show () bereikt en is er onduidelijkheid over welke kopie moet worden overgeërfd.
Net als bij meervoudige overerving, kan het diamantprobleem ook worden opgelost met behulp van interfaces.
Overervingsregels in Java
Tot nu toe hebben we de basisprincipes van overerving gezien, evenals de soorten overerving in Java. Laten we enkele regels opsommen die we moeten volgen bij het ontwikkelen van applicaties met overerving.
Regel # 1: Java ondersteunt geen meervoudige overerving
Zoals we al hebben gezien, ondersteunt Java geen enkele vorm van overerving. Wanneer meerdere overerving wordt geprobeerd in een programma, geeft de Java-compiler een compilatiefout.
Regel # 2: Java staat geen cyclische overerving toe
Een klasse die zichzelf erft om een cyclus te vormen, wordt cyclische overerving genoemd.
Beschouw de volgende klassen, class1 en class2.
class class1 breidt class 2 uit {}
class class2 breidt class 1 uit {}
De bovenstaande situatie vormt een lus. Dit is in Java niet toegestaan.
Regel 3: We kunnen geen leden van privégegevens erven
We hebben al geleerd in het onderwerp 'Toegangsmodificatoren' dat leden met privétoegang niet kunnen worden overgenomen.
Regel # 4: Constructors worden niet geërfd
Omdat constructors worden gebruikt voor het maken van klasseobjecten, worden ze niet van de ene klasse naar de andere overgeërfd.
Regel # 5: We kunnen ouderreferentie gebruiken om toegang te krijgen tot onderliggende objecten
We hebben al verschillende voorbeelden van overerving gezien. We kunnen een verwijzing van het type bovenliggende klasse maken en er vervolgens een afgeleid klasseobject aan toewijzen dat is gemaakt met behulp van het nieuwe trefwoord.
Als super een superklasse is en sub een klasse is die is afgeleid van super, zoals hieronder wordt weergegeven.
Regel # 6: Bovenliggende constructors worden uitgevoerd vanwege super () in afgeleide constructors
Een van de regels stelt dat constructors niet kunnen worden overgenomen. Maar de constructor van de superklasse kan binnen de constructor van de afgeleide klasse worden uitgevoerd met de aanroep super ().
Veel Gestelde Vragen
V # 1) Welk type overerving wordt niet ondersteund door Java?
Antwoord: Java ondersteunt geen meervoudige overerving, aangezien dit problemen kan veroorzaken in toepassingen zoals het diamantprobleem. Java ondersteunt ook geen hybride overerving, aangezien het een combinatie is van een of meer overervingstypen en uiteindelijk kan leiden tot meervoudige overerving.
Vraag 2) Welke van de leden van de klas kunnen worden geërfd?
Antwoord: Een klasse kan openbare en beschermde leden van zijn basisklasse erven, maar heeft geen toegang tot de privéleden van de basisklasse.
V # 3) Waarom is meervoudige overerving niet toegestaan?
Antwoord: Meervoudige overerving resulteert in dubbelzinnigheid wanneer twee-ouderklassen methoden hebben met hetzelfde prototype. In dit geval wordt de afgeleide klasse geconfronteerd met een onduidelijkheid over van welke basisklasse deze de methode moet erven.
Meervoudige overerving kan ook resulteren in een diamantprobleem in Java. Daarom ondersteunt Java geen meervoudige overerving.
V # 4) Waarom heb je meervoudige overerving nodig?
beste optimalisatiesoftware voor Windows 10
Antwoord: Talen zoals Java en C # dwingen de meervoudige overerving af met behulp van meerdere interfaces. Dus als we functies van meer dan één interface moeten overnemen, hebben we meerdere overervingen nodig.
V # 5) Wat is het belangrijkste gebruik van overerving op meerdere niveaus?
Antwoord: Een klasse afgeleid van een andere klasse die op zijn beurt is afgeleid van een derde klasse zou overerving op meerdere niveaus vertonen. De niveaus in dit type overerving kunnen worden uitgebreid tot elk getal, zolang het duidelijkheid en eenvoud behoudt.
We kunnen verschillende niveaus van soorten weergeven met behulp van overerving op meerdere niveaus. Vanuit het oogpunt van programmeren, als we verschillende niveaus van applicatieklassen willen vertegenwoordigen, gaan we voor overerving op meerdere niveaus.
Gevolgtrekking
In deze tutorial hebben we de soorten overerving in Java besproken. Java ondersteunt alleen overervingstypen met één, meerdere niveaus en hiërarchisch. Java ondersteunt geen meervoudige en hybride overerving. We hebben de meervoudige overervingsambiguïteit en het diamantprobleem in Java besproken.
Vervolgens bespraken we de verschillende regels die we moeten volgen bij het implementeren van overerving in Java. Hiermee hebben we onze discussie over de IS-A-relatie in Java afgerond.
Bekijk hier de eenvoudige Java-trainingsserie.
Aanbevolen literatuur
- Wat is erfenis in Java - Tutorial met voorbeelden
- Overerving in C ++
- Soorten overerving in C ++
- Java Basics: Java Syntax, Java Class en Core Java Concepts
- Java Integer en Java BigInteger Class met voorbeelden
- Soorten klassen in Java: abstract, concreet, definitief, statisch
- Java-variabelen en hun typen met voorbeelden
- Zelfstudie voor Java-scannerklassen met voorbeelden