我对Java多态性有疑问

时间:2019-04-20 10:50:33

标签: java polymorphism

为什么最终输出是“ 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”?

1 个答案:

答案 0 :(得分:1)

输出为WuffRingding,因为子类public String spielen(Hund h)Fuchs中的方法public String spielen(Fuchs f) 重载 。 当方法重载时,Java会调用该类型的方法,而不是实际实例。

因此,此处使用的类型为Hund的变量hybrid,并且由于要在重载方法的编译时确定要调用的方法,因此会调用Hund类的重载方法虽然它指向Fuchs实例。

现在,您向Fuchs提供了spielen(Hund h)的实例作为参数,该实例显然以类型Hund作为参数,因为HundFuchs并可以保存Fuchs引用,此引用与运行时/动态多态性相结合,调用bellen类的Fuchs方法而不是在运行时调用Hund检查了实例的类型,它实际上指向了Fuchs的实例。

TLDR;

  • spielen引用上调用Hund,由于超载而调用spielen类的Hund
  • 传递了Fuchs的实例,因此由于动态方法调度/运行时多态性,在运行时调用了bellen的方法Fuchs而不是Hund