Catena di costruttori #2

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.