为什么最终输出是“ WuffRingding”而不是“ RingdingRingding”?
package ubung;
class Hund{
public Hund(){
}
public String bellen(){
return "Wuff";
}
public String spielen(Hund h){
return "Wuff" + h.bellen();
}
}
class Fuchs extends Hund{
public Fuchs(){
}
public String bellen(){
return "Ringding";
}
public String spielen(Fuchs f){
return "Ringding"+ f.bellen();
}
}
public class park {
public static void main(String[] args){
Hund bello = new Hund();
Fuchs foxi = new Fuchs();
Hund hybrid = new Fuchs();
System.out.println(hybrid.spielen(foxi));
}
}
为什么最终输出为“ WuffRingding”而不是“ RingdingRingding”? 为什么最终输出是“ WuffRingding”而不是“ RingdingRingding”?
答案 0 :(得分:1)
输出为WuffRingding
,因为子类public String spielen(Hund h)
至Fuchs
中的方法public String spielen(Fuchs f)
已 重载 。
当方法重载时,Java会调用该类型的方法,而不是实际实例。
因此,此处使用的类型为Hund
的变量hybrid
,并且由于要在重载方法的编译时确定要调用的方法,因此会调用Hund
类的重载方法虽然它指向Fuchs
实例。
现在,您向Fuchs
提供了spielen(Hund h)
的实例作为参数,该实例显然以类型Hund
作为参数,因为Hund
是Fuchs
并可以保存Fuchs
引用,此引用与运行时/动态多态性相结合,调用bellen
类的Fuchs
方法而不是在运行时调用Hund
检查了实例的类型,它实际上指向了Fuchs
的实例。
TLDR;
spielen
引用上调用Hund
,由于超载而调用spielen
类的Hund
。Fuchs
的实例,因此由于动态方法调度/运行时多态性,在运行时调用了bellen
的方法Fuchs
而不是Hund
。