2009-10-15 10 views
8

Je pensais à l'origine que les blocs statiques étaient pour les variables statiques, mais le compilateur permet à la fois A et B de compiler et de courir, ce qui donne?
ASur les blocs d'initialisation statiques et non statiques en Java

private static final Map<String,String> m = new HashMap<String,String>(); 

     { 
      m.put("why", "does"); 
      m.put("this","work"); 
     } 

B

private static final Map<String,String> m = new HashMap<String,String>(); 

     static{ 
       m.put("why", "does"); 
       m.put("this","work"); 
      } 

Courir System.out.println(Main.m.toString()); pour A imprime

{}

courant la même pour B imprime à Yoda-parler

{= ce travail, pourquoi =} ne

+0

Y at-il une alternative aux blocs statiques et non statiques? –

Répondre

13

Le bloc non statique est exécuté lorsqu'une "instance" de la classe est créée.

Ainsi

System.out.println(Main.m.toString()); 

rien imprime parce que vous ne l'avez pas créé une instance.

Essayez de créer une instance première

Main main = new Main(); 

et vous verrez le même message que B

Comme vous le savez variables de classe (déclarées à l'aide statique) sont une portée lors de l'utilisation des blocs d'instance.

Voir aussi:

Anonymous Code Blocks In Java

+0

Ce qui rend le sens logique parfait –

6

En A, vous avez un initialiseur d'instance. Il sera exécuté chaque fois que vous construisez une nouvelle instance de A.

Si plusieurs threads construisent A instances, ce code serait rompu. Et même dans un seul thread, vous ne voulez généralement pas qu'une seule instance modifie l'état partagé par chaque instance. Mais si vous l'avez fait, c'est une façon de l'atteindre.

+1

Erickson est correct - créer une nouvelle instance, et ils seront équivalents. Et si vous modifiez les valeurs de ces clés, puis créez une autre nouvelle instance, elles seront à nouveau remplacées par les valeurs d'origine. – aperkins

Questions connexes