![]() ![]() |
|
![]() ![]() |
Come sappiamo, un oggetto viene creato con la primitiva
new, la cui sintassi è:
La primitiva new fa concettualmente tre cose:
Nel caso <nomeClasse> abbia una superclasse diversa da Object, le cose sono leggermente più complicate. |
![]() ![]() |
|
![]() ![]() |
Abbiamo visto la struttura degli oggetti della classe
Studente, che eredita da Persona:
![]() Concettualmente, un oggetto di
Studente può essere visto come un
oggetto di Persona (contenente solo le
variabili di istanza nome e
indirizzo) esteso con le variabili d'istanza
proprie di Persona.
Per questo motivo, la new invoca sull'oggetto
appena creato non solo il costruttore di
Studente, ma anche un costruttore della sua superclasse Persona.
|
![]() ![]() |
|
![]() ![]() |
Vediamo un esempio concreto. Il
seguente programma CostruttoriEredAdd sfrutta tre classi tali che
EredAdd_C estende EredAdd_B che estende EredAdd_A. Ogni classe ha un
costruttore, che incrementa l'unica variabile
d'istanza.
Se lo eseguiamo, stamperà "Valore di c.x : 3", e questo dimostra che sul nuovo oggetto vengono invocati tutti e tre i costruttori. |
![]() ![]() |
|
![]() ![]() |
In quale ordine vengono invocati i
costruttori? Nel seguente programma CostruttoriEredOrd,
analogo al precedente, ogni costruttore stampa una stringa
corrispondente alla
propria classe.
Eseguendo la classe, verrà stampato
|
![]() ![]() |
|
![]() ![]() |
Le regole seguenti determinano in modo ricorsivo la sequenza completa dei costruttori che vengono
invocati al momento della creazione di un oggetto:
Esercizio: osservare cosa succede compilando le classi Ered_A, Ered_B e Ered_C eseguendo poi CostruttoriEred. Sapete spiegare quali costruttori sono invocati e in quale ordine vengono invocati? |
![]() ![]() |
|
![]() ![]() |
Consideriamo la seguente versione delle classi Persona e Studente:
Se le compiliamo, viene segnalato il seguente errore:
Infatti il costruttore default della classe PersonaErr non è disponibile. La soluzione corretta richiede l'uso di super(...), come visto precedentemente (oppure la definizione del costruttore senza argomenti per la classe PersonaErr).
|