首先,一个难题: 下面的代码打印什么?
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
回答:
0
剧透一下。
如果按比例(长)打印 X
并重新定义 X = scale(10) + 3
,
指纹是 X = 0
然后是 X = 3
。
这意味着 X
被临时设置为 0
,然后再设置为 3
。
这是违反 final
的!
静态修饰符与最终修饰符结合使用,也用于定义常量。 最后一个修饰符指示 这个字段不能更改的值。
资料来源: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
我的问题是:
这是窃听器吗?
final
是不明确的吗?
这是我感兴趣的代码。
X
被赋予两个不同的值: 0
和 3
。
我认为这违反了 final
。
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10) + 3;
private static long scale(long value) {
System.out.println("X = " + X);
return X * value;
}
}
这个问题被标记为 Java 静态最终字段初始化顺序的可能副本。
我相信这个问题是 没有的一个复制品
另一个问题解决初始化的顺序,而
我的问题解决了与 final
标签相结合的循环初始化。
仅从另一个问题来看,我不能理解为什么我的问题中的代码没有出错。
通过观察欧内斯托得到的产出,这一点尤为明显:
当 a
被标记为 final
时,他会得到以下输出:
a=5
a=5
这不涉及我问题的主要部分: final
变量如何改变它的变量?