Una catena di derivazione di classi con i metodi costruttori che impostano, correttamente, lo stato dell’istanza
public class SuperSuperClasse { protected int ssc; public SuperSuperClasse(int ssx) { ssc=ssx; System.out.println("Super Super Classe: ssc="+ssc); } }
public class SuperClasse extends SuperSuperClasse { protected int sc; public SuperClasse(int sx, int sy) { super(sx); sc=sy; System.out.println("Super Classe: ssc="+ssc+", sc="+sc); } }
public class Classe extends SuperClasse { protected int c; public Classe(int x, int y, int z) { super(x, y); c=z; System.out.println("Classe: ssc="+ssc+", sc="+sc+", c="+c); } }
Se si istanziano le classi
public class CostruttoriTest2 { public static void main(String args[]) { SuperSuperClasse s_s_classe = new SuperSuperClasse(5); System.out.println(); SuperClasse s_classe = new SuperClasse(5, 10); System.out.println(); Classe classe = new Classe(5, 10, 15); } }
è possibile seguire le sequenze di metodi costruttori attivati esplicitamente, tramite super(...)
Super Super Classe: ssc=5 Super Super Classe: ssc=5 Super Classe: ssc=5, sc=10 Super Super Classe: ssc=5 Super Classe: ssc=5, sc=10 Classe: ssc=5, sc=10, c=15
Nota
Il compilatore non include il metodo costruttore di default in presenza della dichiarazione esplicita di un costruttore e quindi il codice
public class SuperClasse extends SuperSuperClasse { protected int sc; public SuperClasse(int sx, int sy) { //super(sx); sc=sy; System.out.println("Super Classe: ssc="+ssc+", sc="+sc); } }
non può essere compilato perché il costruttore di SuperClasse effettua una chiamata implicita al costruttore di default di SuperSuperClasse che non esiste.
In pratica la riga mancante
//super(sx);
equivale a
super();
e questo metodo non esiste.