首先,一个难题:以下代码显示什么?
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
变量如何更改其变量?
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
X
成员的方式就像在超类构造函数完成之前引用子类成员一样,这是您的问题,而不是的定义final
。