Ordine di Esecuzione dei Costruttori in Java

Concetti Chiave
  • I costruttori in Java vengono eseguiti in ordine di derivazione, dalla superclasse alla sottoclasse.
  • L'uso di super() nel costruttore di una sottoclasse garantisce che il costruttore della superclasse venga chiamato prima di quello della sottoclasse.
  • In una gerarchia di classi, i costruttori completano la loro esecuzione in ordine di derivazione, assicurando che l'inizializzazione della superclasse avvenga prima di quella della sottoclasse.
  • Se super() non viene usato, il costruttore di default della superclasse viene eseguito automaticamente.

Costruttori e Ordine di Esecuzione

Quando viene creata una gerarchia di classi, in quale ordine vengono eseguiti i costruttori delle classi che compongono la gerarchia?

Per esempio, dato un sottoclasse chiamata B e una superclasse chiamata A, il costruttore di A viene eseguito prima di quello di B, o viceversa?

La risposta è che in una gerarchia di classi, i costruttori completano la loro esecuzione in ordine di derivazione, dalla superclasse alla sottoclasse.

Inoltre, poiché super() deve essere la prima istruzione eseguita nel costruttore di una sottoclasse, questo ordine è lo stesso sia che venga usato super() o meno. Se super() non viene usato, allora verrà eseguito il costruttore di default o senza parametri di ciascuna superclasse.

Il seguente programma illustra quando i costruttori vengono eseguiti:

// Dimostra quando i costruttori vengono eseguiti.

// Crea una superclasse.
class A {
    A() {
        System.out.println("Dentro il costruttore di A.");
    }
}
// Crea una sottoclasse estendendo la classe A.
class B extends A {
    B() {
        System.out.println("Dentro il costruttore di B.");
    }
}
// Crea un'altra sottoclasse estendendo la classe B.
class C extends B {
    C() {
        System.out.println("Dentro il costruttore di C.");
    }
}
class ChiamataCostruttori {
    public static void main(String[] args) {
        C c = new C();
    }
}

L'output di questo programma è il seguente:

Dentro il costruttore di A.
Dentro il costruttore di B.
Dentro il costruttore di C.

Come si può vedere, i costruttori vengono eseguiti in ordine di derivazione.

Se ci si riflette, ha senso che i costruttori completino la loro esecuzione in ordine di derivazione. Poiché una superclasse non ha conoscenza di alcuna sottoclasse, qualsiasi inizializzazione che deve essere eseguita è separata da ed eventualmente prerequisito per qualsiasi inizializzazione eseguita dalla sottoclasse. Pertanto, deve completare prima la propria esecuzione.