Overerving in Java is een van de kernconcepten van Objectgeoriënteerd Programmeren. Java-overerving wordt gebruikt wanneer er een ‘is-een’ relatie tussen objecten bestaat. Overerving in Java wordt geïmplementeerd met het extends
-trefwoord.
Overerving in Java
Overerving in Java is de methode om een hiërarchie tussen klassen te creëren door over te erven van andere klassen.
Java-overerving is transitief – dus als Sedan Car uitbreidt en Car Vehicle uitbreidt, dan erft Sedan ook van de Vehicle-klasse. Vehicle wordt de superklasse van zowel Car als Sedan.
Overerving wordt veel gebruikt in Java-toepassingen, bijvoorbeeld door de Exception-klasse uit te breiden om een toepassingsspecifieke Exception-klasse te maken die meer informatie bevat zoals foutcodes. Bijvoorbeeld NullPointerException.
Voorbeeld van Java-overerving
Elke klasse in Java breidt impliciet de klasse java.lang.Object
uit. Dus de Object-klasse staat bovenaan de overervingshiërarchie in Java.
Laten we eens kijken hoe we overerving in Java kunnen implementeren aan de hand van een eenvoudig voorbeeld.
Superklasse: Dier
package com.journaldev.inheritance;
public class Animal {
private boolean vegetarian;
private String eats;
private int noOfLegs;
public Animal(){}
public Animal(boolean veg, String food, int legs){
this.vegetarian = veg;
this.eats = food;
this.noOfLegs = legs;
}
public boolean isVegetarian() {
return vegetarian;
}
public void setVegetarian(boolean vegetarian) {
this.vegetarian = vegetarian;
}
public String getEats() {
return eats;
}
public void setEats(String eats) {
this.eats = eats;
}
public int getNoOfLegs() {
return noOfLegs;
}
public void setNoOfLegs(int noOfLegs) {
this.noOfLegs = noOfLegs;
}
}
Het dier is de basisklasse hier. Laten we een Kattenklasse maken die erft van de Dierklasse.
Onderklasse: Kat
package com.journaldev.inheritance;
public class Cat extends Animal{
private String color;
public Cat(boolean veg, String food, int legs) {
super(veg, food, legs);
this.color="White";
}
public Cat(boolean veg, String food, int legs, String color){
super(veg, food, legs);
this.color=color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
Merk op dat we het extends
-sleutelwoord gebruiken om overerving te implementeren in Java.
Java Overervings Testprogramma
Laten we een eenvoudige testklasse schrijven om een Kattenobject te maken en enkele van zijn methoden te gebruiken.
package com.journaldev.inheritance;
public class AnimalInheritanceTest {
public static void main(String[] args) {
Cat cat = new Cat(false, "milk", 4, "black");
System.out.println("Cat is Vegetarian?" + cat.isVegetarian());
System.out.println("Cat eats " + cat.getEats());
System.out.println("Cat has " + cat.getNoOfLegs() + " legs.");
System.out.println("Cat color is " + cat.getColor());
}
}
Uitvoer:
De Kattenklasse heeft geen getEats()
-methode, maar toch werkt het programma omdat deze geërfd is van de Dierklasse.
Belangrijke punten
-
Herbruik van code is het belangrijkste voordeel van overerving omdat onderklassen de variabelen en methoden van de superklasse erven.
-
Private leden van de superklasse zijn niet direct toegankelijk voor de onderklasse. Zoals in dit voorbeeld is de variabele van het Dier noOfLegs niet toegankelijk voor de Kattenklasse, maar het kan indirect toegankelijk zijn via getter- en setter-methoden.
-
Leden van superklasse met standaardtoegang zijn alleen toegankelijk voor subklasse als ze zich in dezelfde pakket bevinden.
-
Constructors van superklasse worden niet geërfd door subklasse.
-
Als superklasse geen standaardconstructor heeft, moet de subklasse ook een expliciete constructor gedefinieerd hebben. Anders zal het een compileerfout veroorzaken. In de constructor van de subklasse is de oproep naar de superklasse constructor in dit geval verplicht en het moet het eerste statement in de constructor van de subklasse zijn.
-
Java ondersteunt geen meervoudige overerving, een subklasse kan slechts één klasse uitbreiden. De klasse Animal breidt impliciet de klasse Object uit en de klasse Cat breidt de klasse Animal uit, maar vanwege de transitive aard van de overerving in Java breidt de klasse Cat ook de klasse Object uit.
-
We kunnen een instantie van een subklasse maken en deze vervolgens toewijzen aan een variabele van de superklasse, dit wordt upcasting genoemd. Hieronder volgt een eenvoudig voorbeeld van upcasting:
Cat c = new Cat(); // instantie van subklasse Animal a = c; // upcasting, het is prima omdat Cat ook een Animal is
-
Wanneer een instantie van Superklasse aan een Subklasse-variabele wordt toegewezen, wordt dit downcasting genoemd. We moeten dit expliciet casten naar Subklasse. Bijvoorbeeld;
Kat c = new Kat(); Dier a = c; Kat c1 = (Kat) a; // expliciete casting, werkt prima omdat "c" eigenlijk van het type Kat is
Merk op dat de compiler geen klachten zal geven, zelfs als we het verkeerd doen, vanwege expliciete casting. Hieronder staan enkele gevallen waarin het een
ClassCastException
zal veroorzaken tijdens runtime.Hond d = new Hond(); Dier a = d; Kat c1 = (Kat) a; //ClassCastException tijdens runtime Dier a1 = new Dier(); Kat c2 = (Kat) a1; //ClassCastException omdat a1 tijdens runtime eigenlijk van het type Dier is
-
We kunnen de methode van Superklasse in de Subklasse overschrijven. We moeten echter altijd de overschreven methode annoteren met @Override-annotatie. De compiler zal weten dat we een methode overschrijven en als er iets verandert in de methode van de superklasse, krijgen we een compileerfout in plaats van ongewenste resultaten tijdens runtime.
-
We kunnen de methoden van de superklasse aanroepen en toegang krijgen tot variabelen van de superklasse met het sleutelwoord super. Het is handig als we dezelfde naam van variabele/methode in de subklasse hebben, maar we willen de variabele/methode van de superklasse benaderen. Dit wordt ook gebruikt wanneer constructeurs zijn gedefinieerd in de superklasse en subklasse en we expliciet de constructeur van de superklasse moeten aanroepen.
-
We kunnen de instructie
instanceof
gebruiken om de overerving tussen objecten te controleren, laten we dit zien aan de hand van het onderstaande voorbeeld.
```
Cat c = new Cat();
Dog d = new Dog();
Animal an = c;
boolean flag = c instanceof Cat; //normal case, returns true
flag = c instanceof Animal; // returns true since c is-an Animal too
flag = an instanceof Cat; //returns true because a is of type Cat at runtime
flag = an instanceof Dog; //returns false for obvious reasons.
```
- We kunnen geen Finale klassen uitbreiden in Java.
- Als je van plan bent om de Superclass niet in de code te gebruiken, dat wil zeggen dat je Superclass slechts een basis is om herbruikbare code te behouden, dan kun je ze als volgt houden: Abstracte klasse, om onnodige instantiatie door clientklassen te voorkomen. Het zal ook de instantiecreatie van de basisklasse beperken.
Java Overerving Video Zelfstudie
I have recently published two videos on YouTube explaining Inheritance in detail with sample programs, you should watch them below.
Je kunt meer voorbeelden van overerving bekijken in onze GitHub-opslagplaats.
Referentie: Oracle-documentatie
Source:
https://www.digitalocean.com/community/tutorials/inheritance-java-example