Java - final变量

11

我知道一旦为final变量分配了值,它就不能被更改。但是我有几个关于此的问题:

  • 当我有一个字段,例如在类外面声明 static final JButton button;,然后在main方法中尝试为它赋值时,比如button = new JButton("OK"); ,我会收到一个错误提示告诉我要去掉final修饰符?但是既然原始的button变量还没有引用对象,我认为我可以为它赋值一次?

  • 其次,如果我完全删除对button的引用,只剩下static final JButton button;在类外部,我的IDE会报错:“未初始化空final字段button”。这是否意味着所有final字段必须被初始化?如果是这样,它们必须在那里立即被初始化吗?因为我似乎无法稍后初始化它。

  • 另外,这可能是一个愚蠢的问题,但我的最初假设是一个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);
    }

}
7个回答

18

你应该在静态初始化程序块中或直接初始化静态 final 变量。因此,要么

static final JButton button = new JButton();
或者
static final JButton button;

static {
  button = new JButton();
}

Java语言规范有更多的文档说明:有关final变量的章节指定了为什么会出现编译错误:

如果在赋值之前没有明确地未分配(§16),则将最终变量分配给它是一个编译时错误。

第16章讨论了明确分配。


在声明时初始化final变量不是强制性的吗? - Muhammad Babar

3

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

唯一的例外是final变量可以在构造函数中初始化。由于静态字段不属于实例,所以它们必须进行初始化(没有构造函数),直接初始化或静态初始化块是可选的方法。

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


0

一个final变量只能被初始化一次,可以通过初始化程序或赋值语句来实现。它不需要在声明时进行初始化:这被称为“空白final”变量。

Final变量的类型

1)实例final变量:

类的空白final实例变量必须在声明它的类的每个构造函数结束时被明确定义;否则,将出现编译时错误。

2)静态final变量:

空白final静态变量必须在声明它的类的静态初始化器中被明确定义;否则,将出现编译时错误。

在这两种情况下,意图是避免在初始化之前使用final变量。

因此,在您的情况下,它必须通过静态初始化器块进行初始化,该块在加载类时进行初始化。

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


0
类域中的final变量必须在声明时或构造函数中初始化。在主函数中无法为final变量赋值,除非它是在主函数中声明的。所有final字段都必须被初始化。所有变量在使用之前必须被初始化。

0

正确的答案是,static final变量总是在类初始化时进行初始化--要么使用您提供的值,要么使用默认值(null、0、false)。


0
问题出在类内方法(主方法也是方法 :))中初始化最终变量。在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);
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接