标题可能会引起误解,但作为一个非本地人我不能找出一个更好的。类的引用类型和实际的类类型,它决定调用哪个方法?
说,我有两个班,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
它仍然引用s到一个Fox
对象,但我仍然有这样的输出:
WuffRingding
第二个我得到了同样的问题,因为foxi
是Fox
和hybrid
一个实例实际上是Fox
实例(?无论什么参考,右)输出中应"RingdingRingding"
但话又说回来,我得到:
WuffRingding
有人可以解释为什么吗?
重要的是'Fox.play(Fox)'不会覆盖'Dog.play(Dog)'。因为'hybrid'的类型是'Dog',所以'play(Dog)'超载被调用。 –
@AndyTurner嗨安迪,谢谢你的回答。仍然当谈到类型转换时,实体类型是否正确?比方说,我把(狗)投给Fox的一个实例并且调用树皮方法,它仍然是Fox类中的方法,对吧?我在参考和铸造之间有点混淆.. –
要调用的方法在编译时确定,而不是运行时。因此,如果您将一个对Dog的引用传递给某个方法,则会调用“Dog”过载,即使在运行时引用了Fox。 –