PDA

View Full Version : [Java] Perchè questo output?


Seether
15-07-2008, 11:23
Ciao a tutti, avrei un paio di domande sul seguente frammento di codice:

class a {
public a() {
System.out.println("Costruttore di a senza parametri "+this.toString()+" "+this.getClass());
}
public a(int s) {
System.out.println("Costruttore di a con un parametro "+this.toString()+" "+this.getClass());
}
}

class b extends a {
a test = new a(8);
int e;
public b (int x) {
e = x;
System.out.println("Costruttore di b con un parametro "+this.toString()+" "+this.getClass());
}
public b () {
this(9);
System.out.println("Costruttore di b senza parametri"+this.toString()+" "+this.getClass());
}
}

public class prova {
public static void main(String args[]) {
a primo = new a(0);
a secondo = new a(3);
System.out.println("");
b terzo = new b();
}
}

L'output di questo programma è il seguente:

Costruttore di a con un parametro a@3e25a5 class a
Costruttore di a con un parametro a@19821f class a

Costruttore di a senza parametri b@addbf1 class b
Costruttore di a con un parametro a@42e816 class a
Costruttore di b con un parametro b@addbf1 class b
Costruttore di b senza parametrib@addbf1 class b

Nell'output, le ultime quattro righe sono tutte relative all'istanziamento dell'oggetto "terzo", ma non mi sono troppo chiare... Cosa provoca esattamente ciascuna di esse, e qual è la ragione precisa del loro ordine? Inoltre, come si spiega che nella prima mi ritrovo anche col costruttore di "a" in un oggetto di tipo "b"?

Grazie mille anticipatamente :)

71104
15-07-2008, 11:54
Cosa provoca esattamente ciascuna di esse, e qual è la ragione precisa del loro ordine? prima viene eseguito a() implicitamente chiamato da b(), poi si ritorna all'inizializzazione di b che prevede l'istanziamento di un oggetto a con un argomento (e quindi viene chiamato a(int)), poi si entra in b() il quale prima chiama b(int) e poi stampa la sua riga di output.


Inoltre, come si spiega che nella prima mi ritrovo anche col costruttore di "a" in un oggetto di tipo "b"? perché il costruttore no-arg di b prima di entrare in esecuzione chiama implicitamente il super-costruttore no-arg, cioè il costruttore no-arg di a; la classe tuttavia sempre b è.

Seether
15-07-2008, 12:02
Quindi se ho capito bene l'invocazione del costruttore della classe genitrice avviene comunque PRIMA dell'istanziamento delle variabili della classe figlia, no?

Ok, grazie mille ^^

banryu79
15-07-2008, 12:12
L'odine di esecuzione durante l'inizializzazione di un oggetto di una data classe è il seguente (vado a memoria quindi perdonate/corregete errori e omisisoni):
- blocchi statici;
- costruttore/i (delle eventuali classi antenate nella catena di eredità);
- inizializzazione dei membri dichiarati (ai valori di default da parte della jvm);
- costruttore (della classe in oggetto).

@EDIT:
Seether hai ragione, grazie della correzione, ho corretto il post anch'io.

Seether
15-07-2008, 12:15
In teoria, come si evince da questo stesso esempio, le variabili di istanza sono inizializzate *prima* del costruttore della classe che le contiene, ma comunque *dopo* il costruttore della classe genitrice (ammesso che esista).