2017-07-04 2 views
0

J'étudie des initialiseurs statiques en Java. Je suis venu à travers un code source donnée ci-dessous:Pourquoi l'initialiseur statique permet la ré-initialisation de la variable statique en Java?

public class A { 
     private static int count = 5; 
     final static int STEP = 10; 
     boolean alive; 
     static { 
     count = 1; 
     } 
     public static void main(String[] args) { 
      A a = new A(); 
      System.out.println(A.count); 
     } 
    } 

Ma question est que pourquoi le compilateur ne se plaint pas de la count variable étant réaffecté la valeur 1 dans count = 1 dans le bloc statique d'initialisation. Je sais que Java permet le référencement en avant tant que déclaration, avant lecture règle (ie un identifiant ne doit pas être lu avant la déclaration) est suivie qui est pour tous les initialiseurs et sinon, la référence (ou identifiant) doit venir sur la côté gauche de l'assignation. Je sais également que si plusieurs expressions d'initialisation statiques et blocs d'initialisation de champ statique sont écrits dans une classe, leur ordre d'exécution est séquentiel. Selon moi, le flux d'exécution doit être: La classe est chargée, puis tous les initialiseurs statiques (expressions et blocs) sont exécutés en séquence, en raison de laquelle le count sera initialisé pour la valeur 5, puis le constructeur par défaut sera exécuté en appelant le super() et en initialisant la variable d'instance alive à la valeur par défaut. Mais pourquoi il ne jette une erreur variable statique count a été ré-initialisé (comme il est pas le cas de référence vers l'avant), au contraire, il donne la sortie 1. Cela signifie-t-il que nous pouvons réinitialiser des variables statiques via des blocs d'initialisation statiques? S'il vous plaît aider. Merci d'avance! :)

+3

Pourquoi pas? Il ISN "t final: vous pouvez l'affecter autant de fois que vous le souhaitez – EJP

+0

Vous n'êtes pas la variable Ré-initialisation, vous réassignez la variable –

Répondre

1

Tant que vous manipulez la variable statique dans la classe, elle est initialisée vous n'obtiendrez pas une erreur du compilateur. Si vous l'aviez déclaré final, le comportement que vous avez mentionné se serait produit. Gardez à l'esprit que static signifie que la variable est partagée entre toutes les instances de l'objet, de sorte qu'elle ne soit initialisée et que la mémoire ne soit allouée qu'une seule fois.

+0

plus claire et conceptuelle. Merci! Il a aidé à clarifier le concept. J'ai essayé réaffectant la variable dans le constructeur et l'instance initialiseur et cela a fonctionné! :) –

+0

@ patrick.1729 Inshort, l'ordre n'a pas d'importance ici. –

1

Étant donné que votre variable de classe apparaît avant utilisation, c'est ok.

Voici le language specification#Static Initializers pour la même

Une initialiseur statique déclarée dans une classe est exécutée lorsque la classe est initialisé (§12.4.2). Avec les initialiseurs de champ pour les variables de classe (§8.3.2), des initialiseurs statiques peuvent être utilisés pour initialiser les variables de classe de la classe.

Utilisation des variables de classe dont les déclarations apparaissent textuellement après l'utilisation est parfois limitée, même si ces variables de classe sont en portée. Voir §8.3.3 pour les règles précises régissant la référence à l'avance aux variables de classe.

+0

complémentation:.. Dans cette question, le bloc initialiseur pourrait apparaître avant la déclaration depuis la champ est utilisé dans le côté gauche d'une affectation. –

+0

Merci à la fois, mais la réponse donnée par @ al3xkr est –