慕粉18883846529
2016-09-06 18:09
为什么输出中dog.mothod( );和重写toString( )方法的结果中age都为Animal类中的age的值10,而不是22,name都为dog.name="xiaoming",而不是“Cat”。
在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但是主函数赋值过所以不操作;
希望这样表述你能明白
age是全局变量,所以两次赋值都改变了同一内存中的值,而name是局部变量,两次改变不是同一内存地址的值,取第一次赋值的值
把dog类的第四行注释掉
把第四行注释掉试试?
Java入门第二季 升级版
530653 学习 · 6091 问题
相似问题