2009-08-24 8 views
2

Tenir compte de ce code:Quand les blocs init de l'instance sont-ils appelés?

public class Main { 


static String s = "-"; 

public static void main (String [] args){ 

    go(); 
    System.out.println(s); 

    Main m = new Main(); 
} 
{go();} 

static {go();} 
static void go(){s+="s";} 
} 

Sa sortie est:

-ss 

l'instance bloc d'initialisation est jamais appelé, pourquoi?

Répondre

5

On l'appelle - APRES l'impression de s. Les initialiseurs d'instance sont appelés lorsque des instances sont créées.

+2

Si vous allez tous dire la même chose, votez pour la personne qui l'a dit en premier, puis ajoutez simplement un commentaire. Ajouter un autre "System.out.println (s);" à la toute fin de votre bloc "principal" et vous verrez "-sss" comme sortie. –

1

Il est appelé. Cependant il est appelé après l'appel à println parce que vous créez la première instance de Main de cela. Si vous déplacez l'appel à println à la fin de main, vous verrez trois s.

0

Il est appelé, mais après l'impression sur la console. Vous n'en faites une instance qu'après l'impression.

0

Comme les autres l'ont souligné, le bloc d'initialisation instance est appelée, mais il ne marche pas affecter la sortie de votre déclaration System.out.println, car il est appelé en conjonction avec l'invocation de l'instance de votre classe: Main m = new Main();

une chose que vous pouvez faire lorsque vous essayez de déboguer ces cas est de vider une pile de fil au point d'invocation:

static void go() { 
    new Exception().printStackTrace(System.out); 
     s += "s"; 
} 

Cela vous permettra de voir toutes les fois que la méthode go est appelée, et en utilisant le même flux d'impression que votre println dans votre 012 Méthode, vous pouvez voir les piles par rapport à la sortie de votre s var.

Dans ma version, le résultat ressemble à ceci:

java.lang.Exception 
    at Main.go(Main.java:29) 
    at Main.<clinit>(Main.java:25) 
java.lang.Exception 
    at Main.go(Main.java:29) 
    at Main.main(Main.java:14) 
-ss 
java.lang.Exception 
    at Main.go(Main.java:29) 
    at Main.<init>(Main.java:21) 
    at Main.main(Main.java:17) 
1

code de bloc d'initialisation de l'instance passe juste après l'appel à super() dans un constructeur, autrement dit, après que tous les super-constructeurs ont couru.

L'ordre dans lequel les blocs d'initialisation apparaissent dans une classe est important. Si une classe en possède plusieurs, ils sont tous exécutés dans l'ordre où ils apparaissent dans le fichier de classe.

Quelques règles à retenir:

  1. Liste élément blocs d'initialisation exécutent dans l'ordre où ils apparaissent.
  2. Les blocs d'initialisation statiques s'exécutent une fois lorsque la classe est chargée.
  3. Instance Les blocs d'initialisation s'exécutent chaque fois qu'une instance de classe est créée.
  4. Les blocs d'initialisation d'instance s'exécutent après l'appel du constructeur à super().
Questions connexes