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呢,好奇怪???
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呢,好奇怪???
12 回答5.9k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答6.9k 阅读✓ 已解决
3 回答3k 阅读✓ 已解决
5 回答4.6k 阅读
4 回答2.3k 阅读
3 回答4.5k 阅读
类初始化时普通代码和非静态成员变量的执行顺序取决于代码的顺序,所以你的代码是
bipush 6:把整数6压入栈
putfield :把成员变量的值设为栈中的值6
后面int a = 9;
bipush 6:把整数9压入栈
putfield :把成员变量的值设为栈中的值9
所以最后打印的是9
字节码指令如下:
如果交换成员变量和普通代码块的顺序,结果就相反了。
补个图,在Test构造器执行前int a已经声明好了,这应该是类加载的链接阶段做的,还未执行任何代码的时候。