Java-最终变量


问题内容

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

  • 当我有一个字段时,static final JButton button;在类外说,然后在该main方法中,尝试为其分配值button = new JButton("OK");,,我收到一条错误消息,告诉我删除最终修饰符?但是,由于原始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章关于明确赋值会谈