当前位置: 首页 > 知识库问答 >
问题:

我有一个关于java多态性的问题

巩光誉
2023-03-14

为什么最后输出的是“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));


    }
}

为什么最终输出是“颤动”而不是“振铃”?为什么最终输出是“颤动”而不是“振铃”?

共有1个答案

白嘉志
2023-03-14

输出为<code>WuffRingding</code>,因为方法<code>public String spilen(Hund h)</code>在子类<code>Fuchs</code>中被重载到<code>public String spien(Fuchs f)</ccode>。当方法重载时,Java调用类型的方法,而不是实际实例的方法。

因此,这里使用的类型是混合变量的 Hund,并且由于要调用的方法是在编译时为重载方法决定的,因此调用 Hund 类的重载方法,尽管它指向 Fuchs 实例。

现在你提供了一个 Fuchs 实例作为参数提供给 spielen(Hund h),它清楚地将 Hund 类型作为参数,这工作为 HundFuchs 的父级并且可以保存 Fuchs 引用,这与运行时/动态多态性相结合,调用 Fuchs 类的 bellen 方法而不是 Hund 因为在运行时,会检查实例的类型,并且它实际上指向 Fuchs 的实例。

太长,读不下去了

  • Hund引用上调用spilen,在重载时调用Hund类的 >
  • 传递了<code>Fuchs</code>的实例,因此在运行时,由于动态方法调度/运行时多态性,调用<code>Fuchs</code>的<code>bellen</code<,而不是<code>Hund</code
 类似资料:
  • 问题内容: 我有一个C类。E类对此进行了扩展。 为什么是 经过进一步审查:尽管数字转换的语法与转换对象的语法相同,但仍引起一些混淆。无论如何,上面的代码没有给出编译结果,而是给出了运行时错误- 因此,在某些情况下,可以将类强制转换为子类(否则,代码将无法编译)。任何人都可以给出上述工作原理的例子吗? 并且: 给。这是为什么?它被铸造成更一般的! 假设我在M和K中都实现了doIt()方法。 给M或K

  • 他是两个家伙。我需要你的帮助。 我对laravel/Elount/relation中的逻辑和最佳实践有三个问题。 第一种情况 我有四个模型/桌子。 逻辑问题: 我的想法是给数据透视表两个附加的列(与数据透视('user_id','comment_id')) *)第一个问题:我怎样才能实现这个构想? 第二种情况第二个问题与第一个问题相同,但在这些情况下,我如何访问“评论”,而不是使用hasone/b

  • 我在pset3(cs50)中做tideman问题,但是我不能区分我的程序和函数look_pairs的正确程序之间的区别。 这是我的程序,我在正确的程序之间做了一点区别。我没有判断makeCycle(winner,I)的返回,而是返回这个函数,你可以在我的代码中看到区别。 这是正确的版本,但我认为我的程序和正确的版本是一样的,我不知道为什么我的程序会造成这个错误。

  • 为什么我会得到这个错误?为什么尽管导入了junit断言,我还是不能编写而是必须编写?为什么我不能使用mockito中的(message is不能解析'currencyexchange_logictest'中的方法'when')。是不是因为依赖关系,它们出了什么问题?

  • 使用FIXED_WINDOW算法时,"validDuration","MaxAmount"参数是什么意思?

  • 本文向大家介绍关于Java三大特性之多态的总结,包括了关于Java三大特性之多态的总结的使用技巧和注意事项,需要的朋友参考一下 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 1.定义: 多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)