Storia della domanda:
Nelle prime versioni di Java è stato implementato un meccanismo di ereditarietà che consente a una classe figlia di estendere il comportamento della classe genitore. Per accedere ai membri della classe genitore si utilizza la parola chiave super, ereditata da C++.
Problema:
A volte sorge la necessità di accedere esplicitamente a un metodo o a un campo della classe genitore, se sono stati sovrascritti o nascosti. Senza un uso corretto di super possono verificarsi errori o comportamenti non corretti, ad esempio, quando si lavora con i costruttori.
Soluzione:
Con super è possibile:
Esempio:
class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal sound System.out.println("Bark"); } }
Caratteristiche chiave:
Può la chiamata a super non essere la prima riga del costruttore?
No. La chiamata al costruttore del genitore tramite super() deve essere la prima riga del costruttore. Se questa restrizione viene violata, il compilatore fornirà un errore.
Si può utilizzare super nei metodi statici o in un contesto statico?
No. La parola chiave super è applicabile solo in un contesto non statico (di istanza), poiché si riferisce alla gerarchia degli oggetti, non delle classi.
Si può accedere a un metodo privato della classe genitore tramite super?
No. I metodi privati non sono visibili ai discendenti, nemmeno tramite super. Solo i metodi o campi public, protected e package-private possono essere accessibili tramite super.
Lo sviluppatore dimentica di chiamare esplicitamente super() nel costruttore della classe derivata, mentre la superclasse non ha un costruttore di default.
Pro:
Contro:
Il metodo sovrascritto nella sottoclasse chiama prima l'implementazione super e poi la estende con logica aggiuntiva.
Pro:
Contro: