博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
成员变量赋值问题【向前引用】
阅读量:5110 次
发布时间:2019-06-13

本文共 1411 字,大约阅读时间需要 4 分钟。

今天,同学问了我一个问题,代码如下

public class Test10 {    //这个小程序 为啥不报错,应该是先执行a=10这个程序块,但是我们没有设定a的类型啊    {        a = 10;    }    int a = 20;    public static void main(String[] args) {        Test10 t = new Test10();        System.out.println("a的数值为:" + t.a);    }}
  • 开始的时候,我看到这个代码有点懵了(卧槽,谁会这样用啊),于是我就在想:为什么不报错,是不是JVM会把代码全都编译一次,执行到构造代码块的时候,发现后面有对a变量进行定义,所以没有报错。于是就上网查资料去了,后来发现java支持向前引用
  • 接着,我发现输出的值是20(卧槽,怎么是20???,不应该是a=10构造代码块覆盖了在定义成员变量时a=20吗)
  • 于是乎,我又作死地加入了一个构造函数进去,看看执行顺序到底是怎么样的
public class Test10 {    public Test10() {        a=30;    }    //这个小程序 为啥不报错,应该是先执行a=10这个程序块,但是我们没有设定a的类型啊    {        a = 10;    }    int a = 20;    public static void main(String[] args) {        Test10 t = new Test10();        System.out.println("a的数值为:" + t.a);    }}
  • 因为java支持向前引用,构造函数的a那当然不会报错啦。我再次执行该测试的时候,发现a的值为30,此时又懵逼了。按我当时理解是这样的(既然上面输出的是20,那么我加入构造方法,构造方法在构造代码块后执行,同样会被a=20覆盖掉【当时候脑袋短路了,忘记构造方法会覆盖掉成员变量的值】
  • 最后我在知乎RednaxelaFX—-R大中一个回答中似乎找到了答案。截图如下:

  • 简要提炼下语句:对JVM来说所有实例初始化动作都要收集到“特殊的实例初始化方法”(名为“init”,内容对应所有实例初始化器+构造器)里,按代码顺序把实例初始化动作(包括实例字段初始化与匿名的实例初始化器)收集起来,然后是构造器自身的内容
  • 就是说构造代码块和成员变量的赋值顺序是依照代码的顺序执行的
  • 剔除构造方法,将构造代码块和声明成员变量位置交换一下,看看结果
public class Test10 {    int a = 20;    {        a = 10;    }    public static void main(String[] args) {        Test10 t = new Test10();        System.out.println("a的数值为:" + t.a);    }}
  • 输出的结果是10。

  • ps:如果我有理解错误的地方,请留言,谢谢!

参考资料:

向前引用:

执行顺序RednaxelaFX的回答:

转载于:https://www.cnblogs.com/zhong-fucheng/p/7203057.html

你可能感兴趣的文章
保留字段数组,一定要用char
查看>>
MySQL 忘记 root 密码重置方法
查看>>
排序之归并排序
查看>>
Windows Socket 编程 : 支持多线程(TCP)(环境:VS2010)
查看>>
BZOJ1096: [ZJOI2007]仓库建设(dp+斜率优化)
查看>>
CAS5.0.X 使用经历
查看>>
HDU 2610 (自己完全找不到思路) Sequence one
查看>>
JAVA对存储过程的调用方法(本文源于网络)
查看>>
排序思想
查看>>
linux服务器git pull/push时提示输入账号密码之免除设置
查看>>
Thinking in Java Reading Note(1.对象导论)
查看>>
3087Shuffle'm Up
查看>>
前端开发基础2(css----选择器)
查看>>
[YTU]_2636 ( B3 指向基类的指针访问派生类的成员函数)
查看>>
第一阶段冲刺8
查看>>
程序猿/媛段子
查看>>
材料的构成 —— 塑料
查看>>
Boltzmann 玻尔兹曼机(BM)
查看>>
前端开发中的字符编码
查看>>
关于是否走索引的讨论
查看>>