[英]Static final field initialization from static initializer
为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始化程序访问静态最终字段?
起初,我认为这是一个Eclipse bug:
我还缺乏一些知识,因为静态初始化器不是我的日常业务。 但是,看哪,这没有预期的类限定符:
为了完成我的测试系列,我在bash中尝试了一下:
导致相同的结果。
这引出了我最后的问题:
从静态初始化程序块访问静态最终字段时是否有任何理由禁止类限定符? 因为声明类之前没有初始化?
实际上,您可以从静态初始化程序初始化静态字段。
但我认为(我不确定),你有另一个问题。 这里的问题是你(根据编译器)尝试分配最终字段。 但是,你的真实意图不是分配它......你正在尝试初始化它 。 但编译器没有得到这个。
当你调用像Test.I
这样的Test.I
,编译器会认为你正在尝试修改它之前可能被初始化的静态变量(即来自静态初始化器)。 编译器并不聪明地看到你实际上正在初始化你的变量,它只是解释你从一个类中分配一个静态变量,无论是Test
还是Foo
。
但是,如果在没有类限定符的情况下调用它,编译器就会知道您正在尝试修改自己的静态变量,并且在静态初始化程序中,因此操作对于最终字段是安全的。
拜托,我希望我足够清楚,请注意,我不确定这种行为。
为了初始化初始化块中的最终变量,应该使用变量的简单名称。 即变量名单独,没有任何限定符。
它在java语言规范中声明如下
“类似地,每个空白的最终变量必须至多分配一次;当对它进行赋值时,它必须绝对未分配。 当且仅当变量的简单名称或其简单名称合格时,才会定义此类赋值 。 由此,发生在赋值运算符的左侧 .Java编译器必须执行特定的保守流分析,以确保对于空白最终变量的每个赋值,在赋值之前肯定未赋值变量;否则为必须发生编译时错误。“
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.