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


解决方案1:

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

解决方案2:

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

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

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

上一篇如何定位系统上内存泄漏的问题?
下一篇springboot的过滤器一次请求执行了两次,且在第一次获取的某header为空的情况下第二次过滤可以获取header
明星图片
相关文章
《 java 为什么在代码块里不用声明变量的类型》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)