Java – 最终变量

我知道,一旦最终变量赋值给它,就无法更改。 但是我对此有几个问题:

  • 当我有一个字段时,说static final JButton button; 在一个类之外,然后在main方法中,尝试为它赋值, button = new JButton("OK"); ,我收到错误告诉我删除最终修饰符? 但是,由于原始button变量尚未引用一个对象,我的印象是我可以分配一次?

  • 其次,如果我完全删除对button引用,那么我只有static final JButton button; 在课堂外,我的IDE声称“空白的最终字段按钮可能尚未初始化”。 这是否意味着必须初始化所有最终字段? 如果是这样,他们必须在那里初始化,然后我似乎无法在以后初始化它。

  • 另外,愚蠢的问题,但我最初的假设是,当一个实例或数据类型引用最终变量时,它无法分配给其他任何东西是正确的,对吗?

此代码不完整,但提供说明我的观点:

 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语言规范有更多关于它的文档: 关于final变量的部分指定了为什么会出现编译错误:

如果分配了最终变量,那么这是一个编译时错误,除非它在分配之前是明确未分配的(第16段)。

第16章谈到明确的任务

确实必须初始化final字段,因为这将是它们对程序其余部分的值。

一个例外是final变量可以在构造函数中初始化。 由于静态字段不属于实例,因此必须初始化(没有构造函数)直接初始化,或者静态初始化块是执行此操作的选项。

关于你的最后一个问题,是的,这就是为什么它被称为final。

类范围中的最终变量必须在声明或构造函数中初始化。 除非在main函数中声明,否则不能在main函数中指定最终变量。 必须初始化所有最终字段。 所有变量必须在使用前初始化。

问题是在类中的方法中初始化最终变量(main方法也是方法:))。 在java中,“final”就像常量一样,它只能初始化一次。 用组合而不是聚合来做。

 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 var 始终在类初始化时初始化 – 要么是你提供的值,要么是默认值(null,0,false)。

最终变量只能通过初始化程序或赋值语句初始化一次。 它不需要在声明点初始化:这称为“空白最终”变量。

最终变量的类型

1)实例最终变量:

必须在声明它的类的每个构造函数的末尾明确赋值类的空白最终实例变量; 否则,发生编译时错误

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(); } }