为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始化程序访问静态最终字段?
起初,我认为这是一个Eclipse错误:
我还缺乏一些知识,因为静态初始化器不是我的日常业务。但是,看哪,这没有预期的类限定符:
为了完成我的测试系列,我在bash中尝试了一下:
导致相同的结果。
这引出了我最后一个问题:
从静态初始化程序块访问静态最终字段时是否有任何理由禁止类限定符? 因为声明类之前没有初始化?
答案 0 :(得分:5)
实际上,您 可以 从静态初始化程序初始化静态字段。
但我认为(我不确定),你有另一个问题。这里的问题是你(根据编译器)尝试分配最终字段。但是,您的真实意图不是分配它......您正在尝试 初始化 。但编译器并没有得到这个。
当您调用类似Test.I
之类的内容时,编译器会认为您正在尝试修改之前可能已初始化的静态变量(即来自静态初始化程序)。编译器 不是那么聪明 ,以确定您实际上正在初始化变量,它只是在解释您从中分配静态变量一个班级,无论是Test
还是Foo
。
但是,如果在没有类限定符的情况下调用它,则编译器知道您正在尝试修改自己的静态变量,并且在静态初始化程序中,因此操作是安全的最终字段。
请,我希望我已经足够清楚了,请注意,我不确定这种行为。
答案 1 :(得分:1)
为了初始化初始化块中的最终变量,应该使用变量的简单名称。即变量名单独,没有任何限定词。
在java语言规范中陈述如下
"同样,每个空白的最终变量最多只能分配一次;当它的赋值发生时,它必须是绝对未分配的。 当且仅当变量的简单名称或由其限定的简单名称出现在赋值运算符的左侧时,才会定义此类赋值。 Java编译器必须执行特定的保守流分析,以确保对于空白最终变量的每个赋值,该变量在赋值之前肯定是未分配的;否则必须发生编译时错误。"