32 votes

Le bloc statique n'est pas appelé

Qui peut expliquer ce qui se passe?

public class MagicFinal {

    public static void main(String[] args) {
        System.out.println(A.s);
    }
}

class A {
    static {
        System.out.println("class has been loaded");
    }

    public static final String s = "final";

    public static final Integer i = 3;


}

Console :

final

Qu'est-il? Je ne comprends pas pourquoi la classe n'a pas été chargé, je sais que les classes se chargent toujours au premier appel. Champ s est dans la piscine de la chaîne, je vois que le modificateur final est magique.

Si je supprime final modificateur (public static String s = "final" ) je vais obtenir

Console :

la classe a été chargé

final

Note: j'ai changé de domaine i : public static final int i = 3; et de l'afficher dans la console. J'ai eu la même que dans la Chaîne de situation. Pourquoi?

46voto

Marko Topolnik Points 77257

"final" est un littéral de chaîne et, comme telle, est une constante de compilation de l'expression. La valeur d'un static final variable initialisée avec une constante de compilation de l'expression est directement codé en dur dans la classe, qui fait référence, et aucune référence n'est faite à l'origine de la classe. Par conséquent, l'initialisation de l'origine de classe ne se produit pas.

Comme un point de côté, merci de noter la distinction entre la classe de chargement et de classe d'initialisation: seule la dernière occurrence est précisément spécifié par le JLS. Chargement de classe peut arriver à tout moment.

3voto

Abhijith Nagarajan Points 1510

C'est ce qui est écrit en Java Language Specification {8.3.2.1 les Initialiseurs d'une Classe de Variables}. Cela doit répondre à votre question

Une subtilité ici, c'est que, au moment de l'exécution, les variables statiques qui sont définitives et que sont initialisées avec une constante de compilation valeurs sont initialisées en premier. Cela aussi s'applique à des domaines tels dans les interfaces (§9.3.1). Ces variables sont "constantes" que ne sera jamais observés à leur valeur par défaut valeurs initiales (§4.12.5), même par de sournois de programmes. Voir §12.4.2 et §13.4.9 pour plus de discussion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X