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

为什么会这样输出?

57ce94d10001809205000320.jpg

57ce94d80001d9e905000228.jpg

57ce94de00014db105000320.jpg

57ce94e50001326703920095.jpg

为什么输出中dog.mothod( );和重写toString( )方法的结果中age都为Animal类中的age的值10,而不是22,name都为dog.name="xiaoming",而不是“Cat”。

正在回答

4 回答

在Dogs里面声明了age变量同时又继承了父类里面的age变量,这时候主程序对age赋值实际上是dog.this.age=22;而super.age的初始值是Animal定义的=10;

你在mothod函数里面调用super.eat函数使用的是super.age,也就是为10. 同时对于从Animal继承的toString函数里面调用的也是super.age,同样结果为10.

而name由于在子类没有被定义同名变量所以主函数赋值的xiaoming,从而在Animal里面赋值语句没有被执行,所以输出的都是xiaoming。


-----------------上面说的不太清楚,我从内存的角度说下吧-----------------

先实例Animal,内存:地址1-》age   地址2-》name;eat函数和toString调用地址1和地址2的变量

再接着实例Dogs,内存变成:地址1-》super.age   地址2-》name   地址3-》this.age;super.eat函数和toString调用地址1和地址2的变量;eat函数不调用变量;method函数调用super.eat函数;

主函数的age赋值给地址3,name赋值给地址2,Animal的age赋值给了地址1,name本该赋值给地址2但是主函数赋值过所以不操作;

希望这样表述你能明白

1 回复 有任何疑惑可以回复我~
#1

慕粉18883846529 提问者

非常感谢!
2016-09-06 回复 有任何疑惑可以回复我~

age是全局变量,所以两次赋值都改变了同一内存中的值,而name是局部变量,两次改变不是同一内存地址的值,取第一次赋值的值

0 回复 有任何疑惑可以回复我~

把dog类的第四行注释掉

0 回复 有任何疑惑可以回复我~

把第四行注释掉试试?

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第二季 升级版
  • 参与学习       530627    人
  • 解答问题       6091    个

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

进入课程

为什么会这样输出?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信