我正在开发一个类,其中包含final
访问修饰符的某些字段,如:final textField
,我可以将这些字段分配给他们。当我将它们更改为static final
时,我不能再为它们分配任何东西(它抱怨它们是最终的,就像它应该首先完成的那样)。任何想法为什么会发生这种情况?
第一种情况的例子:
final LabelField label_title;
label_title = new LabelField(
"Press the button to launch the speed test",
LabelField.FIELD_HCENTER);
答案 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 */ }
)中执行此操作应该没问题,这对于类的初始化是有意义的。