Method overriding in Java meesteren
Method overriding in Java meesteren
Verken Java's method overriding met hands-on voorbeelden, sleutelregels en het krachtige super-sleutelwoord.
Vorige week behandelden we erfenis, de kern OOP feature die een subklasse toestaat eigenschappen en gedrag van een superklasse te erven. Nu duiken we in method overriding – wanneer een subklasse zijn eigen implementatie levert van een methode al gedefinieerd in zijn ouderklasse.
Voorbeeld 1: Basis method overriding
class Dier { public void toonInfo() { System.out.println("Ik ben een dier."); } } class Hond extends Dier { @Override public void toonInfo() { System.out.println("Ik ben een hond."); } } class Main { public static void main(String[] args) { Hond d1 = new Hond(); d1.toonInfo(); } }
Uitvoer:
Ik ben een hond.
In deze snippet declareren zowel Dier als Hond toonInfo(). Wanneer de Hond instantie het aanroept, draait de subklasse-implementatie, wat overriding demonstreert.
Let op de @Override annotatie. Het vertelt de compiler dat de methode de superklasse-versie moet vervangen; als de handtekeningen niet matchen, gooit de compiler een fout. Hoewel niet verplicht, is het een best practice die beschermt tegen ongelukkige fouten.
Java overriding regels
- Methodenamen, return types en parameterlijsten moeten identiek zijn in beide klassen.
- Final of static methoden kunnen niet worden ge-override.
- Abstracte methoden in een superklasse moeten worden ge-override door concrete subklassen.
super gebruiken om een superklasse-methode aan te roepen
Kunnen we de ouder-methode nog steeds aanroepen na overriden? Absoluut – gebruik het super sleutelwoord.
Voorbeeld 2: super benutten
class Dier { public void toonInfo() { System.out.println("Ik ben een dier."); } } class Hond extends Dier { public void toonInfo() { super.toonInfo(); System.out.println("Ik ben een hond."); } } class Main { public static void main(String[] args) { Hond d1 = new Hond(); d1.toonInfo(); } }
Uitvoer:
Ik ben een dier. Ik ben een hond.
Hier roept Hond eerst Dier.toonInfo() aan via super, voegt dan zijn eigen boodschap toe.
Onthoud, constructors worden niet geërfd, dus er is geen "constructor overriding". Een subklasse kan echter een superklasse constructor aanroepen met super() – zie de Java super sleutelwoord gids.
Toegangsniveaus bij overriden
Ge-override methoden kunnen in zichtbaarheid verschillen, maar alleen op een manier die toegang verbruimt.
Als een superklasse-methode protected is, mag een subklasse hem protected of public declareren, maar niet private.
Voorbeeld 3: Zichtbaarheid wijzigen
class Dier { protected void toonInfo() { System.out.println("Ik ben een dier."); } } class Hond extends Dier { public void toonInfo() { System.out.println("Ik ben een hond."); } } class Main { public static void main(String[] args) { Hond d1 = new Hond(); d1.toonInfo(); } }
Uitvoer:
Ik ben een hond.
Omdat public bredere toegang biedt dan protected, is de override geldig.
Abstracte methoden overriden
Abstracte klassen declareren vaak methoden zonder body. Elke concrete subklasse moet een implementatie leveren; anders vlagt de compiler een fout. We zullen abstracte klassen dieper verkennen in een toekomstige tutorial.
Java
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Annotatie typen: uitgebreide gids over voorgedefinieerde, aangepaste en meta annotaties
- Java String length() Methode: Hoe de grootte van een String op te vragen (Voorbeeld)
- Java String.indexOf() beheersen: Substrings lokaliseren & praktische voorbeelden
- Java String.charAt() begrijpen: Syntaxis, Retourtype, Exceptions en Praktisch Voorbeeld
- Java's String compareTo() Methode beheersen: Syntaxis, Use Cases en Praktische Voorbeelden
- Java String.contains() Methode: Controleren op Substrings – Praktische Voorbeelden
- Java String.endsWith() beheersen: Controleren op String-suffixen met voorbeelden
- Java String Vervanging beheersen: replace(), replaceAll() en replaceFirst() uitgelegd