在Java中分配最终字段

时间:2012-10-18 15:12:37

标签: java final

我正在开发一个类,其中包含final访问修饰符的某些字段,如:final textField,我可以将这些字段分配给他们。当我将它们更改为static final时,我不能再为它们分配任何东西(它抱怨它们是最终的,就像它应该首先完成的那样)。任何想法为什么会发生这种情况?

第一种情况的例子:

final LabelField label_title;

label_title = new LabelField(
        "Press the button to launch the speed test",
        LabelField.FIELD_HCENTER);

5 个答案:

答案 0 :(得分:15)

您可以在构造函数中指定final个字段,但不能在构造函数中指定static final个字段。在任何情况下都不应该更改构造函数中的静态字段。

答案 1 :(得分:7)

当一个字段定义为final时,必须在构造对象时初始化它,即允许你在构造函数中为它赋值。

static字段属于类本身,即每个类一个。因此,static final字段在构造函数中不可分配,每个对象一个。

希望你有意义!

答案 2 :(得分:4)

无法更改最终成员的价值。但是允许在构造函数中初始化最终实例字段。班级成员不允许这样做。下一个片段显示了允许的内容和不允许的内容:

public class Final {

    final static Integer INT1;  // compile error
    final static Integer INT2 = new Integer(2);
    final Integer int3;
    final Integer int4 = new Integer(4);

    public Final() {
        int3 = new Integer(3);
        int3 = new Integer(3); // compile error
    }
}

答案 3 :(得分:3)

来自JLS - final fields: -

  

字段可以声明为final(§4.12.4)。类和实例   变量(静态和非静态字段)可以声明为final。

     

如果是一个空白的final(§4.12.4)类变量,那么这是一个编译时错误   没有通过静态初始化器(第8.7节)明确赋值(第16.8节)   声明它的类。

     

必须明确指定空白的最终实例变量(第16.9节)   类的每个构造函数(第8.8节)的结尾   声明;否则会发生编译时错误。

因此,JLS明确指定您应在静态初始化程序块中分配static final字段。你不能在任何构造函数中分配它们。

因此,如果您有static final字段,则应该将其初始化,或者使用Static Initializer Block初始化它们。

此外,您可以在构造函数中分配final字段,前提是您以后不在任何地方更改分配..

答案 4 :(得分:1)

一个静态字段属于该类,它应该在加载类之后(应该)初始化,即必须初始化它(如果值是最终的,则需要指定值)。

当有人需要实例化类时,将调用构造函数。现在,如果在构造函数中更改静态final字段的值,则意味着您正在尝试更改(或重新分配)它的值。

但是在静态初始值设定项(static { /* assign value here */ })中执行此操作应该没问题,这对于类的初始化是有意义的。