为了账号安全,请及时绑定邮箱和手机立即绑定

这段代码的输出结果能不能给解释解释?

这段代码的输出结果能不能给解释解释?

慕的地8271018 2019-04-26 18:19:22
public class A { public A() {init();} protected void init() {} static class B extends A{ int i,j=999; protected void init() { System.out.println("此时A的构造方法正在调用此方法:i的值为:"+i+",j的值为:"+j); i=888; j=111; } } public static void main(String[] args) { B b = new B(); System.out.println("最终i的值为:"+b.i+",j的值为:"+b.j); } }
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

输出结果:此时A的构造方法正在调用此方法:i的值为:0,j的值为:0
最终i的值为:888,j的值为:999

楼主这道题刚开始看确实有点诡异。所以我只能根据结果来推断。
首先在执行B b = new B();的时候,会调用B的构造函数,而B是继承A的,相当于在B的构造函数中有super();这一句,所以会执行A的构造函数。而A的构造函数又调用了init方法。可这里A的init方法已经被B给重写了,而且这里是生成的B的实例,所以会执行B的init方法。执行完后i=888,j=111.这时构造方法执行完毕,开始执行赋值操作,而成员变量i并没有赋值操作,i还是等于888,而j已经做了赋值操作,所以j被赋值为999.你可以给i一个赋值测试一下,发现i的值会是你赋的值。至于为什么先执行构造函数再执行赋值操作,你可以谷歌搜索JVM类加载子系统的执行过程。


查看完整回答
反对 回复 2019-05-06
  • 2 回答
  • 0 关注
  • 425 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号