我最近一直在阅读java中的动态多态(我是初学者)。根据我的理解如果父类类型的引用被指定为对其子代的引用,如下所示
tutorialspoint它涉及动态多态性。在链接中讨论的示例中,我了解员工类的Object用于访问工资类的(重写)方法。 在该示例中,既不是员工抽象也不是界面。 (表示可以为父级创建对象)。
现在,根据这个链接stackoverflow,我看到一个接口用于讨论动态多态。
问题:如何使用interface作为动态多态的示例?
此外,在tutorialspoint中讨论的示例中,据说编译器在父类中查找方法,但JVM在运行时调用子类方法。
接口既没有方法定义也没有实例化,所以如何才能实现
List<Animal> animalPen = new LinkedList<>();
用于动态多态。
答案 0 :(得分:0)
实际上,解释并没有太大的不同。
List animalPen = new LinkedList<>();
boolean empty = animalPen.isEmpty();
在此示例中,编译器通过查看其引用类型animalPen
来验证isEmpty
是否具有方法List
。 List
声明方法isEmpty
,因此,即使它没有定义它,系统也可以保证animalPen
具有该签名的已定义方法。
这是因为非抽象类必须从它实现的所有接口定义所有方法。这可以确保接口的所有实例都是在其层次结构中的某个位置定义接口方法的实例。
答案 1 :(得分:0)
当对象中有不同的行为时,使用接口来执行多态操作。假设您有一个Duck类,并且您声明了一个FlyBehavior变量。在这种情况下,您首先想到的是一个名为FlyBehavior的类来创建该类型的对象。现在让我们假设你有不同类型的鸭子,如野鸭,红头鸭,现在你有一只橡皮鸭,它们都延伸了鸭子类。你的橡皮鸭不会飞,所以FlyBehavior对于橡皮鸭会有所不同。因此,您将FlyBehavior作为一个接口并创建两个新类:ItFlies和NoFly,它们都实现了FlyBehavior接口。 Duck中的构造函数将具有一个FlyBehavior参数,当您创建Duck类型的新对象时,您需要填充该参数,正如您所说,接口无法实例化,但是由于ItFlies和NoFly都实现了FlyBehavior接口,您可以使用这两个类(或任何实现FlyBehavior的类)填充FlyBehavior参数。这种面向对象的技术对于使您的程序在进行修改时更加独立和灵活也很有用。