【发布时间】:2017-02-14 12:54:02
【问题描述】:
标题可能具有误导性,但作为非本地人,我想不出更好的标题。
假设我有两个班级,Dog 和 Fox:
public class Dog {
public String bark() {
return "Wuff";
}
public String play(Dog d) {
return "Wuff" + d.bark();
}
}
public class Fox extends Dog {
public String bark() {
return "Ringding" ;
}
public String play(Fox f) {
return "Ringding" + f.bark();
}
}
我创建了一些实例并调用了一些方法
Fox foxi = new Fox();
Dog hybrid = new Fox();
System.out.println(hybrid.play(foxi)); // Output number 1
System.out.println(foxi.play(hybrid)); // Output number 2
对于 1. 输出我期望 "RingdingRingding" 因为 hybrid 实际上是对 Dog 实例的引用,即使引用的类型是 Dog
它仍然引用Fox 对象,但我仍然得到了这个输出:
呜呜呜
第二个我遇到了同样的问题,因为foxi 是Fox 的一个实例,而hybrid 实际上是Fox 的一个实例(不管是什么引用,对吧?),输出应该是@ 987654334@ 但话又说回来,我得到了:
呜呜呜
有人可以解释为什么吗?
【问题讨论】:
-
重要的是
Fox.play(Fox)不会覆盖Dog.play(Dog)。因为hybrid的类型是Dog,所以调用了play(Dog)重载。 -
@AndyTurner 嗨,安迪,感谢您的回答。仍然在类型转换方面,实际类型确实很重要吗?假设我将 (Dog) 转换为 Fox 的一个实例并调用 bark 方法,它仍然是 Fox 类中的方法,对吧?我在参考和铸造之间有点困惑..
-
要调用的方法是在编译时确定的,而不是在运行时确定的。因此,如果您将对
Dog的引用传递给方法,则会调用采用Dog的重载 - 即使它在运行时引用Fox。 -
@AndyTurner 我真的不明白你说什么。那么为什么当我将(Dog)类型转换为 Fox 的对象时,Fox 中的方法 bark() 仍然会被调用,因为这里对象的实际类型很重要。你有一些关键字,所以我可以了解更多?
标签: java inheritance overloading overriding