java 为什么在代码块里不用声明变量的类型

 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呢,好奇怪???

阅读 3.3k
2 个回答

类初始化时普通代码和非静态成员变量的执行顺序取决于代码的顺序,所以你的代码是
bipush 6:把整数6压入栈
putfield :把成员变量的值设为栈中的值6
后面int a = 9;
bipush 6:把整数9压入栈
putfield :把成员变量的值设为栈中的值9
所以最后打印的是9
字节码指令如下:
图片描述

如果交换成员变量和普通代码块的顺序,结果就相反了。
图片描述

补个图,在Test构造器执行前int a已经声明好了,这应该是类加载的链接阶段做的,还未执行任何代码的时候。

因为只是赋值不是声明
代码中的代码会被加到构造方法的最前面执行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏