我知道,一旦最终的变量分配给它的价值,它不能被改变。 不过,我只是有几个关于这个问题:
当我有一个领域,比如说static final JButton button;
一类的外部,然后在main
方法,尝试分配它的值, button = new JButton("OK");
,我得到一个错误,告诉我删除final修饰符? 然而,因为原来的button
变量还没有引用一个对象我的印象是,我可以为它分配一次?
其次,如果我完全删除的参考button
,所以我只是有static final JButton button;
在类外,我的IDE声称“空白最后一个字段按钮可能没有被初始化。” 这是否意味着所有的final字段必须初始化? 如果是的话,他们必须在那里初始化,然后为我似乎无法稍后初始化它。
此外,愚蠢的问题,但我的初步设想是,当最后的变量被引用到的实例或数据类型不能被分配到别的是正确的,对不对?
此代码是不完整的,而是用来说明我的观点:
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);
}
}
你应该初始化静态变量最终无论是在静态初始化,或直接。 因此,无论
static final JButton button = new JButton();
要么
static final JButton button;
static {
button = new JButton();
}
Java语言规范有一些关于它的更多文档:在约最终变量部分指定为什么你的编译错误:
它是一个编译时间错误,如果最后的变量分配给除非它是(§16)的分配之前立即绝对分配。
和第16章关于明确赋值会谈
final
字段必须确实初始化,因为这将是他们对程序的其余部分的价值。
到一个例外是, final
变量可以在构造函数初始化。 由于静态字段不属于他们必须初始化实例(没有构造函数)直接初始化或者静态初始化块是执行的选项。
关于你的最后一个问题,是的,这就是为什么它被称为决赛。
在类范围最终的变量必须在声明中或在构造函数初始化。 除非它是在主函数中声明你不能分配给最终的变量主要功能。 所有的final字段必须初始化。 在使用之前,所有的变量必须初始化。
问题是,在一个方法initiallizing类内的最终变量(主要方法是方法太:))。 在java中“最终”就像是恒定的,它可能只是一次initiallized。 与成分,而不是聚集做到这一点。
public class FinalVarTester {
static final JButton button = new JButton("OK");
public static void main(String[] args) {
JFrame frame = new JFrame();
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
container.add(button, BorderLayout.SOUTH);
}
}
正确的答案是一个static final
无功总是初始化在类初始化时-无论是您提供的值或默认值(NULL,0,假)。
最后一个变量只能要么通过初始化或赋值语句初始化一次。 它并不需要在申报点进行初始化:这就是所谓的“空白最后的”变量。
最终变量的类型
1)INSTANCE最终变量:
一类的空白最终实例变量必须在声明它的类的每一个构造年底被明确赋值; 否则,发生编译时间错误
2)静态最终变量
一个空白的最后静态变量必须在其声明的类的静态初始化被明确赋值; 否则,发生编译时间错误
在这两种情况下的意图是它被初始化之前,以避免使用最终变量。
因此,在你的情况下,必须通过静态初始化块被加载的类时初始化被初始化。
编号: http://en.wikipedia.org/wiki/Final_(Java)
一个更好的不错作弄方式:
public class FinalVarTester
{
static final JButton button;
public FinalVarTester()
{
JFrame frame = new JFrame();
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
container.add(button, BorderLayout.SOUTH);
button = new JButton("OK");
}
public static void main(String[] args)
{
FinalVarTester vTester = new FinalVarTester();
}
}