3

我正在研究一个类,该类具有一些带有final访问修饰符的字段,例如:final textField并且由于某种原因我被允许分配给它们。当我将它们更改为时,static final我不能再为它们分配任何东西(它抱怨它们是最终的,就像它应该首先完成的那样)。任何想法为什么会发生这种情况?

第一种情况的示例:

final LabelField label_title;

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

5 回答 5

17

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

于 2012-10-18T15:14:38.560 回答
7

当字段定义为final时,必须在构造对象时对其进行初始化,即您可以在构造函数中为其赋值。

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

希望它对你有意义!

于 2012-10-18T15:26:48.747 回答
5

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

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
    }
}
于 2012-10-18T15:18:27.437 回答
3

来自JLS - final fields: -

可以将字段声明为最终字段(第 4.12.4 节)。类和实例变量(静态和非静态字段)都可以声明为 final。

如果在其中声明它的类的静态初始化程序(第 8.7 节)没有明确地分配(第 16.8 节)一个空白 final(第 4.12.4 节)类变量,则这是一个编译时错误。

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

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

因此,如果您有一个static final字段,您应该就地初始化它们,或者您可以使用 aStatic Initializer Block来初始化它们。

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

于 2012-10-18T15:14:57.047 回答
1

静态字段属于类,它(应该)在类加载后立即初始化,如果它是 final 则必须初始化(需要分配值)。

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

但是在静态初始化程序 ( static { /* assign value here */ }) 中这样做应该没问题,这意味着初始化类。

于 2012-10-18T15:22:53.333 回答