Java类和静态块

class Hello12 { static int b = 10; static { b = 100; } } class sample { public static void main(String args[]) { System.out.println(Hello12.b); } } 

在运行上面的代码时,输​​出变为100,因为当我调用Hello类时,首先执行静态块,将b的值设置为100并显示它。 但是当我写这段代码时:

 class Hello12 { static { b = 100; } static int b = 10; } class sample { public static void main(String args[]) { System.out.println(Hello12.b); } } 

这里输出为10.我希望答案为100,因为一旦执行静态块,它给b的值为100.所以在main()中,我调用Hello.b它应该引用b(= 100) 。 两个代码中的内存如何分配给b?

在类的“详细初始化过程”中, JLS的第12.4.2节规定:

接下来, 按文本顺序执行类的类变量初始值设定项和类的静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。

这意味着它好像第一个例子是:

 b = 10; b = 100; 

第二个例子是:

 b = 100; b = 10; 

最后一项任务“胜利”,解释你的输出。

静态块和静态变量按它们在源中出现的顺序进行初始化。 如果您的代码是:

 class Hello12 { static int b = 10; static { b = 100; } } 

结果是100。

除了回答代码如何以什么顺序执行的问题之外,我猜你也想知道为什么静态块可以引用尚未文本声明/执行的静态变量。

虽然JLS的第12.4.2节确实解释了静态块和静态变量是按它们出现的文本顺序执行的,但JLS的8.3.3部分解释了何时可以引用什么,并且可以看到The use is not on the left hand side of an assignment;条件The use is not on the left hand side of an assignment; 失败,允许第二个示例中的静态块引用一个静态变量,该静态变量尚未按顺序声明/执行。

静态按照它们在程序中出现的顺序进行评估。