当执行到x1的时候应该先加载类A这是对的
但是你有一句
private static A obj =new A();
那么它去执行A的构造函数了
但此时num1 num2其实已经在内存中有了 值为 0 0 (初始化默认值都是0)
所以new A() 结束后 num1 num2 为 1 1
然后接着往下加载类的初始化
num1被赋值过了 而又因为没有指定默认值 所以就为原来的1
而num2这次是指定默认值 所以赋值为指定默认值 10
其实你要是不确定的话
可以加几个静态代码块进去测试一下
你把
private static A obj =new A();
放在
public static int num1;
public static int num2 = 10;
之后在试试
先建立一个静态空间
debug跟踪一下执行的顺序,或许你就明白些了!