Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从静态初始值设定项初始化静态最终字段_Java_Static Initializer - Fatal编程技术网

Java 从静态初始值设定项初始化静态最终字段

Java 从静态初始值设定项初始化静态最终字段,java,static-initializer,Java,Static Initializer,为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始值设定项访问静态final字段 起初,我认为这是一个Eclipse bug: 我还缺少一些知识,因为静态初始化器不是我的日常事务。但是请注意,这在没有类限定符的情况下是有效的: 为了完成我的测试系列,我在bash中进行了一次尝试: 导致同样的结果 这就引出了最后一个问题: 从静态初始值设定项块访问静态最终字段时,是否有任何理由禁止类限定符? 因为声明类以前没有初始化过?实际上,您可以从静态初始值设定项初始化静态字段 但我认为(我不

为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始值设定项访问静态final字段

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

我还缺少一些知识,因为静态初始化器不是我的日常事务。但是请注意,这在没有类限定符的情况下是有效的:

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

导致同样的结果

这就引出了最后一个问题:

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

实际上,您可以从静态初始值设定项初始化静态字段

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

当您调用类似于
Test.I
的函数时,编译器会认为您试图修改一个静态变量,该变量可能是以前初始化过的(即,来自静态初始值设定项)。编译器不是那么聪明可以看出您实际上正在初始化变量,它只是解释您正在从类中分配一个静态变量,无论是
Test
还是
Foo

但是,如果在不使用类限定符的情况下调用它,编译器会知道您正在尝试修改自己的静态变量,并且是在静态初始值设定项中,因此该操作对于final字段是安全的


请注意,我希望我说得够清楚,请注意,我对这种行为不太确定。

为了初始化初始化块中的最后一个变量,应该使用变量的简单名称。i、 e.不带任何限定符的变量名

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


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

可能重复的@Shail016是正确的,很抱歉。。