7
votes

Pourquoi le bloc d'initialisateur statique ne fonctionne pas dans ce cas simple?

 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.

1 commentaires

Dupliquer:


6 Réponses :


0
votes

Il ne fonctionne pas car la classe n'est jamais chargée. xxx

puisque le champ x sur z a été déclaré avec < Code> Finale statique 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.


0 commentaires


0
votes

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é.


0 commentaires

1
votes

champs qui ont le modificateur statique dans leur déclaration sont appelés champs statiques ou variables de classe . 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. 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

Alors, lorsque vous appelez zx comme ci-dessous: xxx

Il n'initialisera pas la classe, sauf lorsque vous appelez ce Zx Il obtiendra ce x à partir de cet emplacement de mémoire fixe.

bloc statique est exécuté lorsque JVM charge classe z . Ce qui n'est jamais chargé ici car il peut accéder à ce x à partir de directement sans charger la classe.


0 commentaires

1
votes

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é.


0 commentaires

0
votes

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.


0 commentaires