我无法理解以下行(http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.2)
之间的区别A)准备工作涉及将静态字段初始化为默认值。
B)类的初始化包括为类中声明的静态字段(类变量)执行初始化。
是否意味着'a'将在“准备”阶段分配默认值,而'b'将在“初始化”阶段分配值:
static int a;
static int b=2;
答案 0 :(得分:2)
“初始化为默认值”表示字段设置为以下值:
“通过执行初始值设定项初始化”意味着现在将评估分配给这些静态字段的表达式并将其分配给它们。
因此,在“准备”阶段,您的a
和b
将会被创建并获得值0
。在“初始化”阶段,b
将收到值2
。
使用具有副作用的方法很容易验证。我们调用一个返回值b
的静态方法,而不是将简单的“2”赋给2
,而是在执行此操作之前打印有关变量的信息:
public class SimpleTest {
private static int a;
private static int b = printAAndBReturning2("initializer");
static {
printAAndBReturning2("static initializing block");
}
public static void main(String[] args) {
printAAndBReturning2("main");
}
public static int printAAndBReturning2(String where) {
System.out.printf("In %s a is %d and b is %d%n", where, SimpleTest.a, SimpleTest.b);
return 2;
}
}
输出结果为:
In initializer a is 0 and b is 0 In static initializing block a is 0 and b is 2 In main a is 0 and b is 2
此演示还用于警告您使用在初始化阶段运行的方法。
答案 1 :(得分:0)
原始类型的所有字段都将自动初始化为默认值
因为int是0.所以a == 0
。您可以查看默认值here
它在非原始类型(类)上有所不同
所以
Font a;
- > a == null
(如果您尝试使用a
的方法,则会获得a is not initialized
Font b = new Font("Dialog", 16, Font.BOLD);
- > b == ...
(我想你明白了。)