为什么会这样输出?

来源:9-8 Java 中的 Object 类 Ⅰ

慕粉18883846529

2016-09-06 18:09

57ce94d10001809205000320.jpg

57ce94d80001d9e905000228.jpg

57ce94de00014db105000320.jpg

57ce94e50001326703920095.jpg

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

写回答 关注

4回答

  • bbug
    2016-09-06 20:10:58
    已采纳

    在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但是主函数赋值过所以不操作;

    希望这样表述你能明白

    慕粉1888...

    非常感谢!

    2016-09-06 21:27:34

    共 1 条回复 >

  • 慕数据9663351
    2016-09-06 20:21:47

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

  • 首发控卫
    2016-09-06 20:09:18

    把dog类的第四行注释掉

  • 首发控卫
    2016-09-06 20:08:28

    把第四行注释掉试试?

Java入门第二季 升级版

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

530653 学习 · 6091 问题

查看课程

相似问题