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
Quand une classe est chargée et liée, ses static
champs 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:
RED
,GREEN
,BLUE
Eti
sont initialisés à leurs valeurs par défaut (null
pour lesColor
champs et 0 pouri
). Notez que ceci est indépendant de toute initializers.- L'initialiseur pour le champ
RED
(RED = new Color()
) est exécutée. Comme un effet secondaire,i
est incrémentée à 1. - L'initialiseur pour le champ
BLUE
exécute eti
est incrémentée à 2. - L'initialiseur pour le champ
GREEN
exécute eti
est incrémenté à 3. - L'initialiseur pour le
static
champi
exécute eti
reçoit la valeur 0. - La
main()
méthode exécute et produit les résultats cohérents aveci
être 0 lorsquemain()
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 Color
champs:
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 final
modificateurs ont aucun effet sur l'ordre d'initialisation ici parce que GREEN
et BLUE
ne 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 String
variable qui est à la fois déclaré final
et initialisé à une expression constante. Dans ce cas, new Color()
n'est pas une expression constante et Color
n'est pas un type approprié pour une variable constante. Voir, par exemple, §4.12.4 des JLS .