Pourquoi java variable statique n'est pas mise à jour?

Mohasin Ali:

J'ai une classe appelée couleur dans laquelle il y a trois objets statiques (instanciation avec la même classe elle-même) et un type int (appelé i) variable. Quand je lance la classe, la variable « i » est par incréments dans le constructeur, mais il ne persiste dans la mémoire, s'il vous plaît expliquer ce ci-dessous le code

package test;
public class Color
{
     public static  Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
     static int i=0;

     Color(){
         System.out.println("Incrementing 'i'  here  "+(++i));
     }

     public static void main(String[] args) {
         System.out.println("The 'i' variable is not incremented here, it still shows '0' ,  'i' is: "+ Color.i );  // line 14 
        Color x = new Color();
        System.out.println(x.i);
    }
}

Le savoir est comme suit:

Incrementing 'i'  here  1
Incrementing 'i'  here  2
Incrementing 'i'  here  3
The 'i' variable is not incremented here, it still shows '0' ,  'i' is: 0
Incrementing 'i'  here  1
1
Ted Jump:

Quand une classe est chargée et liée, ses staticchamps sont tous initialisés à leurs valeurs par défaut. Une fois cela fait, les initialiseurs de champ statique sont exécutées dans l'ordre où ils apparaissent dans le fichier, complétant ainsi l'initialisation de la classe. Tout cela se produit avant que le code défini dans la classe qui exécute. Alors qu'est - ce qui se passe ici est:

  1. RED, GREEN, BLUEEt isont initialisés à leurs valeurs par défaut ( nullpour les Colorchamps et 0 pour i). Notez que ceci est indépendant de toute initializers.
  2. L'initialiseur pour le champ RED( RED = new Color()) est exécutée. Comme un effet secondaire, iest incrémentée à 1.
  3. L'initialiseur pour le champ BLUEexécute et iest incrémentée à 2.
  4. L'initialiseur pour le champ GREENexécute et iest incrémenté à 3.
  5. L'initialiseur pour le staticchamp iexécute et ireçoit la valeur 0.
  6. La main()méthode exécute et produit les résultats cohérents avec iêtre 0 lorsque main()commence l' exécution.

Vous pouvez lire les détails sordides de tout cela dans le chapitre 12 de la spécification du langage Java (JLS) et le chapitre 5 de la machine virtuelle Java Specification .

Vous pouvez obtenir la sortie que vous attendiez simplement en mouvement la déclaration ià être en avance sur les Colorchamps:

 static int i=0;
 public static  Color RED = new Color();
 public static final Color BLUE = new Color();
 public static final Color GREEN = new Color();

Ensuite, la sortie sera:

Incrémenter « i » ici une
incrémentation « i » ici 2
incrémentation « i » ici 3
Le « i » variable est incrémentée pas ici, elle montre encore « 0 », « i » est la suivante : 3
incrémentation « i » ici 4
4

Notez que les finalmodificateurs ont aucun effet sur l'ordre d'initialisation ici parce que GREENet BLUEne sont pas « variables constantes » , selon la définition de ce terme dans les JLS. Une grandeur constante (un appariement malheureux de mots) est une primitive ou Stringvariable qui est à la fois déclaré finalet initialisé à une expression constante. Dans ce cas, new Color()n'est pas une expression constante et Colorn'est pas un type approprié pour une variable constante. Voir, par exemple, §4.12.4 des JLS .

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=185906&siteId=1
conseillé
Classement