Java - 最终变量

时间:2012-04-21 13:58:05

标签: 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);
    }

}

7 个答案:

答案 0 :(得分:18)

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

static final JButton button = new JButton();

static final JButton button;

static {
  button = new JButton();
}

Java语言规范有更多关于它的文档:section about final variables指定了编译错误的原因:

  

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

chapter 16谈到了明确的任务

答案 1 :(得分:3)

确实必须初始化

final个字段,因为这将是它们对程序其余部分的值。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

问题在于在类中的方法中初始化最终变量(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);
    }
}

答案 4 :(得分:0)

正确的答案是static final var 总是在初始化时初始化 - 要么是你提供的值,要么是默认值(null,0,false)。

答案 5 :(得分:0)

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

最终变量的类型

1)实例最终变量:

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

2)静态最终变量

必须在声明它的类的静态初始值设定项中明确赋值空白的最终静态变量;否则,发生编译时错误

在这两种情况下,目的是避免在初始化之前使用最终变量。

所以在你的情况下,它必须通过静态初始化程序块初始化,该程序段在加载类时初始化。

参考:http://en.wikipedia.org/wiki/Final_(Java)

答案 6 :(得分:0)

更好的编码方式:

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