2010-03-21 2 views
4

Dans le code suivant DEFAULT_CACHE_SIZE est déclaré plus tard, mais il est utilisé pour assigner une valeur à la variable String avant que, donc était curieux comment est-ce possible?Comment cela est le code est compilé même si nous utilisons une constante qui est définie plus tard?

public class Test { 

public String getName() { 
return this.name; 
} 

public int getCacheSize() { 
return this.cacheSize; 
} 

public synchronized void setCacheSize(int size) { 
this.cacheSize = size; 

System.out.println("Cache size now " + this.cacheSize); 
} 

private final String name = "Reginald"; 
private int cacheSize = DEFAULT_CACHE_SIZE; 
private static final int DEFAULT_CACHE_SIZE = 200; 
} 

Répondre

8

De Sun docs:

Le modificateur statique, en combinaison avec le modificateur finale, est également utilisé pour définir des constantes. Le modificateur final indique que la valeur de ce champ ne peut pas changer.

Si un type primitif ou une chaîne est défini comme une constante et que la valeur est connue au moment de la compilation, le compilateur remplace le nom de la constante partout dans le code par sa valeur. On appelle cela une constante

compilation Dans votre code DEFAULT_CACHE_SIZE est une constante de compilation.

4

propriétés statiques de la classe sont toujours résolus immédiatement après la classe est chargée qui est évidemment quelque chose qui se passe avant la classe est instancié à un objet. Contrairement à par exemple C++ où tout doit être déclaré en source avant utilisation, en Java l'ordre réel des constructeurs, des champs et des méthodes n'a aucun effet sur l'ordre d'évaluation et l'heure des différentes propriétés de la classe.

+2

Vrai mais non pertinent. static final sont résolus au moment de la compilation - voir la réponse de codaddict. –

0

Il n'est pas utilisé avant d'être défini. L'affectation peut être sur une ligne plus haut dans la source, mais cela n'a aucune importance - javac lit le fichier source entier, puis commence à générer du code. (En d'autres termes, l'ordre des instructions est important pour déterminer quelles instructions d'une séquence sont exécutées en premier, mais les éléments voisins d'une classe n'ont pas de 'ordre'. de ce genre parmi eux.

Cependant, sont règles concernant les éléments statiques/non statiques, et ceux-ci garantissent que la valeur sera disponible après le chargement de la classe et avant l'instanciation d'objets.

Questions connexes