最终的定义是否不明确?
首先,一个难题:下面的代码打印了什么?
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
通过查看 ernesto 获得的输出,这一点尤其清楚:当被标记为 时,他将获得以下输出:a
final
a=5
a=5
这不涉及我问题的主要部分:变量如何改变其变量?final