2011-09-20 18 views
5

Ho tre classi:Constructor chiamata

public class A { 
    public A(){ 
     System.out.println("in A"); 
    } 
} 


public class B extends A{ 

    public B(){ 
     System.out.println("in b"); 
    } 
} 


public class C extends B{ 

    public C(){ 
     System.out.println("in C"); 
    } 
} 

ora sono davvero sicuro di come il costruttore chiama lavoro. Se istanzio C c= new C();, in quale ordine (e perché questo ordine) vengono richiamati i costruttori. Se istanzio la classe C, non dovrebbe controllare se la classe C ha o meno un costruttore e se lo fa, deve usarlo?

Perché viene emesso-> In A In B In C?

Non sale nella gerarchia solo quando non trova il costruttore nella propria classe? Oppure i costruttori della super classe sono chiamati implicitamente ogni volta?

risposta

3

Il costruttore super viene chiamato per impostazione predefinita dal costruttore della classe base.

L'unico caso in cui è necessario chiamare un costruttore super-classe con super, è quando è necessario passare esplicitamente un parametro al costruttore super-classe stesso.

Quindi la risposta è sì, sono tutti chiamati. L'ordine è dalla classe più aggiornata nella gerarchia fino alla classe base, quindi: A, B, C.

1

Quando viene richiamato un costruttore, per prima cosa chiama super(), quindi se la traccia dello stack mostrerà: C- > B-> A, in realtà A sarà invocato prima e C saranno invocato scorso, così la stampa mostrerà:

in A 
in B 
in C 
+0

Che "effettivamente A sarà invocato per primo" la dicitura è fuorviante. Il costruttore di C viene chiamato prima, perché stai inizializzando un'istanza di tipo C. L'ordine di stampa è causato dal flusso di controllo per i costruttori nella gerarchia, non perché il costruttore di A viene chiamato per primo. –

+0

@Anthony: ho cercato di spiegare questa idea nella mia risposta, se hai un termine migliore lo userò volentieri, purtroppo l'inglese non è la mia lingua madre ..: \ – amit

0

super() è implicita, in quanto i costruttori di default se non costruttori dichiarati.

I costruttori corrono verso l'alto: costruttori

C calls B, B calls A, A calls to Object that does nothing and return to A, then outputs and return the flow to B, that outputs and return to C that outputs. 
2

predefinite sono sempre richiamati, e vengono richiamati top-down - dal più alto super-classe per il più basso della classe base.

Si noti che la chiamata super(...) è necessaria solo per i costruttori parametrizzati. Nel tuo caso non ne hai, quindi il default viene chiamato automaticamente.

+0

+1 per una bella spiegazione ;-) – Deepak

0

Per impostazione predefinita viene chiamato il super costruttore. Viene eseguito prima di qualsiasi riga di codice nel costruttore della classe derivata. Quindi, se chiami nuova C(), viene eseguito il costruttore di A, poi B, quindi qualsiasi cosa in C.

0

Sì, quando non si definisce alcun costruttore, verrà implicitamente creato il costrutto predefinito e richiamato. Ora, quando estendete qualsiasi classe, allora come la classe C va con il suo costruttore, ma non è stato trovato per chiamare esplicitamente la classe super, quindi il compilatore chiama implicitamente il costruttore super-classe.per questo che quando chiamiamo il costruttore super-classe che dichiarazione sempre al primo posto come questo senso

public C(){ 
    super(); 
} 

se si scrive alcuna dichiarazione prima di chiamare il costruttore di super-classe che si errore ricevendo

0

Date un'occhiata alla specifica del linguaggio Java

"Se un corpo del costruttore non inizia con una chiamata al costruttore esplicita e il costruttore che viene dichiarato non fa parte dell'oggetto classe primordiale, il corpo del costruttore viene implicitamente assunto dal compilatore per iniziare con un costrutto della superclasse o invocazione "super();", un'invocazione del costruttore della sua superclasse diretta che non accetta argomenti. "

http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#41652

0

Classe A è la classe di super per B e la classe B è super classe di C. Ciò significa che A è al primo posto tra loro, dove B è in alto per C, vicino alla A e C è in fondo a B. Quindi la classe A viene eseguita prima e poi B e poi C. È una priorità in Java per le super classi.