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);
}
}
这段代码的输出结果能不能给解释解释?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 我爱小白菜 2014-06-06 06:06关注
输出结果:此时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类加载子系统的执行过程。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘