class InstanceInitTest{
{
a = 6;
}
int a = 9;
public static void main(String[] args)
{
System.out.println(new InstanceInitTest().a);
}}
这段代码的执行顺序是: 变量 int a =6 然后是代码块a=6 那为什么最后new InstanceInitTest().a的结果不是6 ,而是9呢,好奇怪???
因为只是赋值不是声明
代码中的代码会被加到构造方法的最前面执行
类初始化时普通代码和非静态成员变量的执行顺序取决于代码的顺序,所以你的代码是
bipush 6:把整数6压入栈
putfield :把成员变量的值设为栈中的值6
后面int a = 9;
bipush 6:把整数9压入栈
putfield :把成员变量的值设为栈中的值9
所以最后打印的是9
字节码指令如下:
如果交换成员变量和普通代码块的顺序,结果就相反了。
补个图,在Test构造器执行前int a已经声明好了,这应该是类加载的链接阶段做的,还未执行任何代码的时候。