欢迎访问诺博源,专业从事IT高端互联网研发与实训机构!

位置:主页 > 常见问题 >

通过Java字节码发现有趣的内幕之初始化篇

时间:2016-03-31 浏览量:

南昌诺博源提醒:
       1、在字节码(1)处隐示的调用了类的父默认构造函数,这个很重要,决定了类的多重初始化过程,详细在最后一个场景展开;

2、代码中myId1和myId2属性声明方式不同,初始化过程也是不一样的,如图中所示,myId1在声明属性时未进行任何的指令操作,而是等到构造函数中的myId1=100时才有执行指令,而像myId2在声明就进行赋值指令,所以myId2会被myId2优先初始化。

3、myText2在声明时赋于null,所以我们可以看到指令也会进行aconst_null的操作,但是在(6)时再次对myText2进行了赋值并再次产生了指令操作。注:null本身不是一种对象,在JVM中没有明确的指明采用什么类型,不同的JVM实现可能不一样,我们可以简单理解为null是一个标志,告诉虚拟机对应的类型还不明确,并还未为其分配空间。

4、从这个场景图的右边字节码指令执行过程我们可以总结出:
  • 有赋值的类 成员属性是按声明的位置先后进行初始化(与访问标志符无关),如图(2)(3);
  • 成员属性的初始化会优先于构造函数的初始化,如图(3)(6);
  • 初始化动作都是在构造函数中完成的, 如果没有显示构造函数,那么编译器会产生一个无入参构造函数来完成初始工作;
  • 建议声明成员属性时没有必要赋于null,等到真实需要使用成成员时再初始化或传递值;

上一篇:BitSet类
下一篇:抽象类和接口的区别
PHP开班信息
PHP实训全日制班

[php高级工程师班]2017-6-23热招中

[PHP工程师就业班]2017-6-23热招中

[php开发工程师班]2017-6-23热招中

Web前端实训班

[Web前端全日制班]2017-6-23热招中

[Web前端业余班]2017-6-23热招中

[Web前端实训晚班]2017-6-23热招中

PHP实训业余班

[PHP工程师名企定制班]2017-6-23热招中

[php开发工程师业余班]2017-6-23热招中

[PHP工程师晚班]2017-6-23热招中

在线预约报名 联系人 性别 联系电话 联系QQ