首先,一个难题:以下代码显示什么?
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。