I know that once a final variable has a value assigned to it, it cannot be changed. However I just have a couple of questions regarding this:
-
When I have a field, say
static final JButton button;outside a class, and then in themainmethod, try to assign it a value,button = new JButton("OK");, I get an error telling me to remove the final modifier? However since the originalbuttonvariable does not yet reference an object I was under the impression I could assign it once? -
Secondly, if I completely remove reference to the
buttonso I just havestatic final JButton button;outside the class, my IDE claims “The blank final field button may not have been initialised.” Does this mean that all final fields must be initialised? And if so, must they be initialised there and then as I can’t seem to initialise it later. -
Also, silly question, but my initial assumption that when a final variable is referenced to an instance or data type it can not be assigned to anything else is correct, right?
This code is not complete but is provided to illustrate my point:
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);
}
}
You should initialize a static final variable either in a static initializer, or directly. So either
or
The Java language specification has some more documentation about it: the section about final variables specifies why you get the compile error:
and chapter 16 talks about the definite assignment