java基础问题:父类实例化子类示例成员“绑定”问题。

geelpheels 2010-09-27 05:10:38
class Mammal {
String name = "furry ";
String makeNoise() { return "generic noise"; }
}
class Zebra extends Mammal {
String name = "stripes ";
String makeNoise() { return "bray"; }
}
public class ZooKeeper {
public static void main(String[] args)
{ new ZooKeeper().go(); }
void go() {
Mammal m = new Zebra();
System.out.println(m.name + m.makeNoise());
}
}

为什么运行结果是:
furry bray

难道Zebra的name不会把Mammal的name重写了吗?

如果能够推荐看什么参考书可以解决类似问题那就更好了!
...全文
219 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
geelpheels 2010-10-03
  • 打赏
  • 举报
回复
看字节码就知道了。
geelpheels 2010-09-28
  • 打赏
  • 举报
回复
谁能推荐一本解决这个问题的参考书?
Dock 2010-09-28
  • 打赏
  • 举报
回复
就是说:方法可以覆盖,而变量不行。。。。楼主赞一个
gujinf2008 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 colaice2009 的回复:]
数据是先期绑定.而函数是后期绑定,要在调用才确定。new Zebra();实际创造了一个zebra对象,所以会调用zebra的方法。
[/Quote] 好像是这个样子,当时老师讲过动态绑定,程序真正运行时确定该对象其实是子类的对象,会执行子类的方法,至于变量,不清楚,或许像他说的,数据时先期绑定吧。
24K純帥 2010-09-28
  • 打赏
  • 举报
回复
重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。
凉岑玉 2010-09-27
  • 打赏
  • 举报
回复
重写只能针对方法·而对于成员变量,这是不行的··除非你再写一个方法用于改变该成员变量的值
colaice2009 2010-09-27
  • 打赏
  • 举报
回复
数据是先期绑定.而函数是后期绑定,要在调用才确定。new Zebra();实际创造了一个zebra对象,所以会调用zebra的方法。
-droidcoffee- 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 geelpheels 的回复:]
引用 1 楼 id19870510 的回复:
你听说过 重写 field 这一说法吗?

override overload 只适用于 方法吧?



那如何区分呢?有什么固定的辨别规则可以套用吗?
[/Quote]

field 是【编译】时确定的
method是【运行】时确定的

本人是这么理解的, 不知道对错

m.name + m.makeNoise()
前者在编译的时候已经确定了 m 的类型,后者则是运行时


geelpheels 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 id19870510 的回复:]
你听说过 重写 field 这一说法吗?

override overload 只适用于 方法吧?
[/Quote]


那如何区分呢?有什么固定的辨别规则可以套用吗?
-droidcoffee- 2010-09-27
  • 打赏
  • 举报
回复
你听说过 重写 field 这一说法吗?

override overload 只适用于 方法吧?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧