6

为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始化程序访问静态最终字段?

起初,我认为这是一个 Eclipse 错误:

日食错误?

我还缺乏一些知识,因为静态初始化器不是我的日常工作。但是你瞧,这在没有类限定符的情况下可以正常工作:

缺少知识?

为了完成我的测试系列,我在 bash 中试了一下:

该死!

导致同样的结果。

这引出了最后一个问题:

从静态初始化块访问静态最终字段时,是否有任何理由禁止类限定符?因为声明类之前没有初始化?

4

2 回答 2

5

实际上,您可以从静态初始化程序初始化静态字段。

但我认为(我不确定),你还有另一个问题。这里的问题是您(根据编译器)试图分配一个最终字段。但是,您的真正意图不是分配它..您正在尝试初始化它。但是编译器没有得到这个。

当你调用类似编译器的东西时Test.I,编译器会认为你正在尝试修改它可能先前已初始化的静态变量(即来自静态初始化器)。编译器并不是很聪明地看到你实际上正在初始化你的变量,它只是解释你正在从一个类中分配一个静态变量,be it Testor be it Foo

但是,如果您在没有类 qualifier的情况下调用它,编译器就会知道您正在尝试修改自己的静态变量,并且在静态初始化程序中,因此该操作对于final字段是安全的。

拜托,我希望我足够清楚,请注意,我不确定这种行为。

于 2014-08-13T11:35:00.590 回答
1

为了在初始化块中初始化最终变量,应该使用变量的简单名称。即没有任何限定符的变量名。

它在java语言规范中说明如下

“同样,每个空白的 final 变量最多只能赋值一次;当对它进行赋值时,它肯定是未赋值的。这样的赋值被定义为当且仅当变量的简单名称或其简单名称合格时才会发生因此,发生在赋值运算符的左侧。Java 编译器必须执行特定的保守流分析,以确保对于空白最终变量的每个赋值,该变量在赋值之前肯定是未赋值的;否则必须发生编译时错误。”

于 2014-08-13T12:02:45.907 回答