【问题标题】:How does dynamic polymorphism in java apply to interfaces?java中的动态多态性如何应用于接口?
【发布时间】:2016-06-15 15:44:39
【问题描述】:

我最近一直在阅读 Java 中的动态多态性(我是初学者)。根据我的理解如果父类类型的引用被分配为其子类的引用,如下所示

tutorialspoint 涉及动态多态。在链接中讨论的示例中,我了解员工类的对象用于访问薪水类的(覆盖)方法。 在该示例中,员工既不是抽象也不是接口。 (这意味着可以为父级创建一个对象)。

现在,根据此链接stackoverflow,我看到一个接口用于讨论动态多态性。

问题:如何使用接口作为动态多态的例子?

此外,在tutorialspoint 中讨论的示例中,据说编译器在父类中查找方法,但JVM 在运行时调用子类方法。

接口既没有方法定义也不能实例化,那么
List<Animal> animalPen = new LinkedList<>();如何用于动态多态。

【问题讨论】:

    标签: java interface polymorphism


    【解决方案1】:

    其实解释并没有太大的不同。

    List animalPen = new LinkedList<>();
    boolean empty = animalPen.isEmpty();
    

    在此示例中,编译器通过查看其引用类型 List 来验证 animalPen 是否具有方法 isEmptyList 声明了 isEmpty 方法,因此,即使它没有定义它,系统也会保证 animalPen 具有由该签名定义的方法。

    这是因为非抽象类必须从它实现的所有接口中定义所有方法。这样可以确保接口的所有实例都是在其层次结构中的某个位置定义了接口方法的实例。

    【讨论】:

      【解决方案2】:

      当您的对象具有不同的行为时,您可以使用接口来执行多态性。假设您有一个 Duck 类,并且声明了一个 FlyBehavior 变量。在这种情况下,您首先想到的是使用一个名为 FlyBehavior 的类来创建该类型的对象。现在假设你有不同类型的鸭子,比如野鸭、红头鸭,现在你有一只橡皮鸭,它们都扩展了 Duck 类。你的橡皮鸭不会飞,所以橡皮鸭的 FlyBehavior 会有所不同。因此,您将 FlyBehavior 设为接口并创建两个新类:ItFlies 和 NoFly,它们都实现了 FlyBehavior 接口。 Duck 中的构造函数会有一个 FlyBehavior 参数,当您创建 Duck 类型的新对象时需要填写该参数,正如您所说,接口无法实例化,但由于 ItFlies 和 NoFly 都实现了 FlyBehavior 接口,您可以使用这两个类(或任何实现 FlyBehavior 的类)填充 FlyBehavior 参数。这种面向对象的技术还有助于使您的程序在进行修改时更加独立和灵活。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-10
        • 2016-07-24
        • 1970-01-01
        • 2012-12-23
        • 2016-09-12
        • 2013-05-17
        • 2019-07-22
        • 2011-02-20
        相关资源
        最近更新 更多