2015-09-24 12 views
6
public class TestLab { 

    static Test aStatic=new Test(); 
    public static void main(String[] args) { 

     TestLab obj=new TestLab(); 
    } 
    static{ 
     System.out.println("In static block of TestLab"); 
      } 

} 


public class Test { 


    static Test ref=new Test(); 
    Test() 
    { 
     System.out.println("Default Constructor of Test"); 
    } 
    static 
    { 
     System.out.println("In Static Block of Test"); 
    } 
    { 
     System.out.println("In instance block of Test"); 
    } 

} 

Normalmente i blocchi statici vengono eseguiti per primi durante il caricamento della classe. Quando si esegue l'esempio precedente, il seguente output ricevuto:Quando gli oggetti vengono creati con riferimento statico, perché il blocco di istanze e il costruttore predefinito vengono eseguiti prima del blocco statico?

In istanza del blocco di prova

default Costruttore di prova

In Static Blocco di prova

In caso di blocco di prova

default Costruttore di prova

In statica blocco di TestLab

Perché il blocco di istanza e costruttore di default della classe Test viene eseguito prima del blocco statico della classe di prova?

+0

possibile duplicato di http://stackoverflow.com/questions/2420389/static-initialization-blocks – Arunachalam

+1

@Arunachalam: Questo non risponde a questa domanda. –

risposta

7

Ok. static campi/blocchi vengono impostati/eseguiti durante l'inizializzazione della classe. Sono eseguiti nell'ordine in cui appaiono nel codice. Così, dopo le lezioni TestLab viene caricato, quando si sta inizializzato, le seguenti cose accadono:

  1. static Test aStatic=new Test(); ==> Chiamato come parte di inizializzazione della classe TestLab. Da qui, viene fatto riferimento alla classe Test. Quindi, il controllo passa alla classe Test.

  2. static Test ref=new Test(); ==> i.e, viene eseguita la prima riga della classe di test (durante la fase di inizializzazione). Questa riga comporta la creazione di una nuova istanza di Test, pertanto il controllo passa al blocco di istanze (nel blocco istanza di Test) di Test e quindi al costruttore (Costruttore predefinito di test).

  3. Ora static Test ref=new Test(); è completa, così, l'inizializzazione classe di Test continua e raggiunge il blocco statico (Static In Blocco di prova). Questo completa l'inizializzazione di Test.

  4. Il controllo torna a TestLab, ora viene chiamato new Test(). Quindi ancora Nel blocco istanza di Test e Il costruttore di prova predefinito viene stampato (la classe è già inizializzata, quindi i campi static non vengono inizializzati di nuovo e i blocchi statici non vengono eseguiti).

  5. Il controllo raggiunge il blocco statico di TestLab (nel blocco statico di TestLab).

+0

Ho ricevuto l'ordine, ma non voglio che i blocchi statici di TestLab e Test vengano eseguiti prima di eseguire qualsiasi istanza o chiamare il costruttore. Voglio dire, il blocco statico viene chiamato quando la classe viene caricata. La classe TestLab non è stata caricata prima dell'esecuzione di ** Test statico aStatic = new Test(); ** e non è la classe di test caricata prima dell'esecuzione ** static Test ref = new Test(); ** –

+1

@ArijitDasgupta - Class l'inizializzazione avviene dopo il caricamento di classe. inizializzatori statici vengono eseguiti durante l'inizializzazione della classe. istanze di blocchi/costruttori di 'Test' vengono eseguite durante * l'inizializzazione * della classe i.e, come parte di quel processo. – TheLostMind

1

Quando il tipo viene inizializzato, tutti gli inizializzatori statici e tutti gli inizializzatori di campo statici vengono eseguiti, in ordine testuale. Da JLS 12.4.2:

successiva, eseguire sia le inizializzatori classe variabili e inizializzatori statici della classe oi inizializzatori campo dell'interfaccia, in ordine testuale, come se fossero un unico blocco.

In altre parole, questo codice viene eseguito:

ref = new Test(); 
System.out.println("In Static Block of Test"); 

Quella prima riga crea un'istanza ... che richiede l'inizializzazione dell'istanza da eseguire. L'inizializzazione di tutte queste istanze avviene prima che il controllo ritorni alla parte di inizializzazione del tipo, vale a dire prima dell'esecuzione della riga dall'inizializzatore statico.

Se si sposta la dichiarazione di campo su dopo l'inizializzatore statico, verranno visualizzati i risultati opposti.

0

solito static variables/blocks verranno inizializzate nell'ordine in cui sono definiti, qui hai segnato aStatic come static. Proverà a creare l'istanza di Test invocando il costruttore, ma come blocco di istanza viene fornito che verrà eseguito e quindi il costruttore e infine il blocco statico.

Problemi correlati