Fra*_*ner 5 java static-initializer
为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始化程序访问静态最终字段?
起初,我认为这是一个Eclipse bug:

我还缺乏一些知识,因为静态初始化器不是我的日常业务.但是,看哪,这没有预期的类限定符:

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

导致相同的结果.
这引出了我最后的问题:
从静态初始化程序块访问静态最终字段时是否有任何理由禁止类限定符?因为声明类之前没有初始化?
实际上,您可以从静态初始化程序初始化静态字段.
但我认为(我不确定),你有另一个问题.这里的问题是你(根据编译器)尝试分配最终字段.但是,你的真实意图不是分配它......你正在尝试初始化它.但编译器没有得到这个.
当您调用类似Test.I编译器时会认为您正在尝试修改可能先前已初始化的静态变量(即来自静态初始化程序).编译器并不聪明地看到你实际上正在初始化你的变量,它只是解释你是从类中分配一个静态变量,无论是它Test还是它Foo.
但是,如果在没有类限定符的情况下调用它,编译器就会知道您正在尝试修改自己的静态变量,并且在静态初始化程序中,因此操作对于最终字段是安全的.
拜托,我希望我足够清楚,请注意,我不确定这种行为.
为了在初始化块中初始化最终变量,应该使用变量的简单名称。即没有任何限定符的变量名。
java语言规范中是这样规定的
“类似地,每个空白的最终变量最多只能被赋值一次;当对其进行赋值时,它必须明确地未赋值。当且仅当变量的简单名称或其简单名称限定时,才定义发生这样的赋值因此,发生在赋值运算符的左侧。Java 编译器必须执行特定的保守流程分析,以确保每次对空白 Final 变量进行赋值时,该变量在赋值之前肯定是未赋值的;否则必须发生编译时错误。”
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |