Java - variables finales
Je sais qu'une fois, une dernière variable a une valeur qui lui est assignée, il ne peut pas être changé. Cependant j'ai juste une ou deux questions concernant cette:
- Quand j'ai un champ, dire
static final JButton button;
à l'extérieur de la classe, puis dans lamain
méthode, essayez d'attribuer une valeur,button = new JButton("OK");
j'obtiens une erreur me disant de supprimer le dernier modificateur? Toutefois, depuis l'originebutton
variable n'a pas encore de référence à un objet que j'étais sous l'impression que je pouvais attribuer une seule fois? - Deuxièmement, si j'ai complètement supprimer la référence à l'
button
je viens donc destatic final JButton button;
en dehors de la classe, mon IDE revendications "Le vide final bouton de champ peut ne pas avoir été consultés." Est-ce à dire que tous les champs doit être initialisé? Et si oui, doivent-ils être initialisé là et puis comme je n'arrive pas à initialiser plus tard. - Aussi, question bête, mais mon hypothèse de départ que lors de la finale de la variable est référencée à une instance ou le type de données qu'il ne peut pas être affecté à autre chose c'est correct, non?
Ce code n'est pas complet, mais il est fourni pour illustrer mon propos:
public class FinalVarTester {
static final JButton button;
public static void main(String[] args) {
JFrame frame = new JFrame();
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
button = new JButton("OK");
container.add(button, BorderLayout.SOUTH);
}
}
source d'informationauteur Tim | 2012-04-21
Vous devez vous connecter pour publier un commentaire.
Vous devez les initialiser une statique de la variable finale, soit dans un initialiseur statique, ou directement. Donc, soit
ou
La Java language specification a plus de documentation à ce sujet: la la section sur les variables final indique pourquoi vous obtenez le message d'erreur de compilation:
et chapitre 16 parle d'une affectation
final
champs doit être initialisé en effet, comme ce sera leur valeur pour le reste du programme.Une exception à cela est qu'un
final
variable peut être initialisée dans le constructeur. Depuis les champs statiques n'appartiennent pas à une instance qu'ils doivent être initialisées (il n'y a pas de constructeur) direct de l'initialisation, ou initialisation statique blocs sont des options pour le faire.Concernant votre dernière question, oui, c'est pourquoi il est appelé final.
Finale de variables dans la portée de classe doit être initialisé dans la déclaration ou dans le constructeur. Vous ne pouvez pas affecter à une variable finale dans la fonction principale, sauf si elle a été déclarée dans la fonction principale. Tous les champs doivent être initialisées. Toutes les variables doivent être initialisées avant qu'ils soient utilisés.
Le problème est avec initiallizing la dernière variable dans une méthode à l'intérieur de la classe(méthode principale est la méthode de trop 🙂 ). En java "finale", c'est comme constante et il pourrait être initiallized juste une fois. Le faire avec la composition de la place de l'agrégation.
La réponse correcte est qu'un
static final
var est toujours initialisé au moment de l'initialisation de la classe, soit à la valeur que vous fournissez ou à la valeur par défaut (null, 0, false).Une dernière variable ne peut être initialisé une fois, soit par l'intermédiaire d'un initialiseur ou une instruction d'affectation. Il n'a pas besoin d'être initialisé au moment de la déclaration: ce qui est appelé un "vide final" à la variable.
Types de Variables Final
1) INSTANCE FINALE DE LA VARIABLE:
Un vide final de la variable d'instance d'une classe doit être définitivement attribué à la fin de chaque constructeur de la classe dans laquelle elle est déclarée; sinon, une erreur de compilation se produit
2) STATIQUE DE LA VARIABLE FINALE
Un vide final de la variable statique doit être définitivement attribué à un initialiseur statique de la classe dans laquelle elle est déclarée; sinon, une erreur de compilation se produit
Dans les deux cas, l'intention est d'éviter d'utiliser la variable finale avant qu'il est initialisé.
Donc dans votre cas, il doit être initialisé par l'initialiseur statique bloc qui initialise lorsque la classe est chargée.
Ref : http://en.wikipedia.org/wiki/Final_(Java)
Une meilleure beau codding façon :