Achtergrond:
In de eerste versies van Java is een erfmechanisme ingebouwd dat toestaat dat een subklasse het gedrag van de bovenliggende klasse uitbreidt. Om toegang te krijgen tot de leden van de bovenliggende klasse, wordt het sleutelwoord super gebruikt, wat is overgenomen uit C++.
Probleem:
Soms is het nodig om expliciet toegang te krijgen tot een methode of veld van de bovenliggende klasse, als deze zijn overschreven of verborgen. Zonder het juiste gebruik van super kunnen er fouten of onjuist gedrag optreden, bijvoorbeeld bij het werken met constructors.
Oplossing:
Met behulp van super kan men:
Voorbeeld:
class Animal { void makeSound() { System.out.println("Animal geluids"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal geluids System.out.println("Blaffen"); } }
Belangrijke kenmerken:
Kan een aanroep van super niet de eerste regel van de constructor zijn?
Nee. De aanroep van de constructor van de bovenliggende klasse met super() moet de eerste regel van de constructor zijn. Als deze beperking is geschonden, zal de compiler een foutmelding geven.
Kan super worden gebruikt in statische methoden of contexten?
Nee. Het sleutelwoord super kan alleen in een niet-statische (instantie) context worden gebruikt, omdat het betrekking heeft op de hiërarchie van objecten, niet op klassen.
Kan men via super toegang krijgen tot een privé-methode van de bovenliggende klasse?
Nee. Privé-methoden zijn niet zichtbaar voor afstammelingen — zelfs niet via super. Alleen public, protected en package-private methoden of velden zijn toegankelijk via super.
Een ontwikkelaar vergeet expliciet super() aan te roepen in de constructor van de afgeleide klasse, terwijl de superklasse geen standaardconstructor heeft.
Voordelen:
Nadelen:
De overschreven methode in de subklasse roept eerst de super-implementatie aan, en breidt deze vervolgens uit met extra logica.
Voordelen:
Nadelen: