class Z { static final int x=10; static { System.out.println("SIB"); } } public class Y { public static void main(String[] args) { System.out.println(Z.x); } } Output :10 why static initialization block not load in this case?? when static x call so all the static member of class z must be load at least once but static initialization block not loading.
6 Réponses :
Il ne fonctionne pas car la classe n'est jamais chargée. puisque le champ x code> sur
z code> a été déclaré avec < Code> Finale statique code> Ils sont créés dans un emplacement de mémoire fixe. L'accès à ce champ n'exige pas que la classe soit chargée. P> p>
Temps de compilation Z.x La valeur devient 10, car SO COMPILER crée un code comme indiqué ci-dessous, après Inline P> System.out.println(10); //which is not calling Z class at runtime
+1 Cela semble être une raison. Supprimer Final code> Le mot-clé exécute le bloc statique. Peut être un peu optimisation du compilateur.
@APURV: Tout cela est très bien expliqué dans la duplicate lié à cette question ( Stackoverflow.com/Questtions/11863800/... )
L'élimination statique ou finale appellera un bloc d'initialisateur statique. Suppression de statique signifie que nous devons créer un objet de la classe Z qui sera chargé au moment de l'exécution. L'élimination des moyens finaux La valeur peut être modifiée et n'est pas une valeur constante.
Si x n'aurait pas été définitive, dans ce cas, JVM doit charger la classe "Z", puis seul le bloc statique serait exécuté. Maintenant, JVM n'a pas besoin de charger la classe «Z» afin que le bloc statique n'est pas exécuté. P>
champs qui ont le modificateur statique dans leur déclaration sont appelés champs statiques strong> ou variables de classe strong>.
ils sont associés à la classe, plutôt que avec n'importe quel objet. Chaque instance de la classe partage un variable de classe, qui est dans un emplacement fixe en mémoire. strong> n'importe quel objet peut modifier la valeur d'une variable de classe, mais les variables de classe peuvent également être manipulé sans créer une instance de la classe p> Alors, lorsque vous appelez
zx code> comme ci-dessous: p>
xxx pré> Il n'initialisera pas la classe, sauf lorsque vous appelez ce
Zx code> Il obtiendra ce
x code> à partir de cet emplacement de mémoire fixe. p>
bloc statique est exécuté lorsque JVM charge
classe z code>. Ce qui n'est jamais chargé ici car il peut accéder à ce
x code> à partir de directement sans charger la classe. P> blockQquote>
La raison en est que lorsque JVM charge une classe, il mettait tous les membres constants de la classe dans la zone constante, lorsque vous en avez besoin, appelez-les directement par le nom de la classe, c'est-à-dire qu'il n'a pas besoin d'instancier La classe de Z. de sorte que le bloc d'initialisation statique n'est pas exécuté. P>
Une constante est appelée parfaitement constante si elle est déclarée en finale statique. Lorsque le compilateur compilait la classe Y & pendant la compilation de SOP (Z.x), il remplace SOP (z.x) avec sop (10) bcz x est une constante parfaite que cela signifie dans la classe de code octet ne pas utiliser Classe Z Donc, tandis que la classe Y classe Y classe Z n'est pas chargée que la sib de la classe Z n'est pas Exécuter. P>
Dupliquer: