【发布时间】:2010-10-28 06:54:04
【问题描述】:
Animal 是 Dog 的超类 Dog 有一个叫 bark 的方法
public void bark()
{
System.out.println("woof");
}
考虑以下几点:
Animal a = new Dog();
if (a instanceof Dog){
a.bark();
}
会发生什么?
- 不允许分配
- 允许调用 bark 并在运行时打印“woof”
- 允许调用 bark,但不打印任何内容
- 对 bark 的调用导致编译时错误
- 对 bark 的调用导致运行时错误
我说的是 2,因为我们正在检查对象是否是狗;因为 dog 是其中包含 bark 方法的类,如果是,则我们调用它,它将打印出来:s
我的理解正确吗?
【问题讨论】:
-
建议将这里的问题改为“超类是否有其子类的方法?”或类似的。
-
诀窍是您正在检查以确保它是一只狗,但编译器没有建立 a.bark 仅在 a 是狗时才被调用的逻辑连接。为了调用 bark() 的目的,您必须明确告诉编译器将 a 视为 Dog,如下面的 Simon622 所述。
-
顺便说一句,这就是为什么许多人更喜欢“鸭式打字”的原因。例如,在 Python 中,等效代码甚至不需要检查
a是否为 Dog;只要a在到达该行时有一个bark方法,它就可以工作。 -
幸运的是只有 1 分,如果问题是“超类有其子类的方法吗?”我会得到标记的:@ 大声笑无论如何我可以在这里扩展问题,以便我可以检查更多
-
回复:鸭子打字--错误的答案。如果动物可以发出声音,makeNoise() 应该在动物基类中。您几乎不必使用强制转换。如果只有一些动物会发出噪音,那应该是 dog 扩展的子类(或者该方法应该抛出异常或返回 null)。好处是,如果你的类设计得当,你很少需要强制转换,所以如果你发现鸭式打字真的有用,请检查你的设计技巧。
标签: java inheritance subclass superclass