Java - 最终变量

Tim*_*Tim 11 java variables static final

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

  • 当我有一个字段,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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Rob*_*bin 18

您应该在静态初始化程序中或直接初始化静态最终变量.所以要么

static final JButton button = new JButton();
Run Code Online (Sandbox Code Playgroud)

要么

static final JButton button;

static {
  button = new JButton();
}
Run Code Online (Sandbox Code Playgroud)

Java语言规范有更多关于它的文档:关于final变量部分指定了为什么会出现编译错误:

如果分配了最终变量,则为编译时错误,除非在分配之前它是明确未分配的(第16段).

第16章关于明确赋值会谈