Java中的动态多态性有什么好处



我正在学习Java编程和面向对象编程。我一直在纠结动态多态性的好处是什么?

请看下面的示例程序。为什么我要用例子1而不是例子2?

class SuperHero {
private String power = ("Generic Power");
public void useSuperPower() {
System.out.println(power);
}
}
class Spiderman extends SuperHero {
private String power = ("Web sling!");
public void useSuperPower() {
System.out.println(power);
}
}
class Wolverine extends SuperHero {
private String power = ("Hack and Slash!");
public void useSuperPower() {
System.out.println(power);
}
}
class main {
public static void main (String args[]) {
//example 1
SuperHero hero = new SuperHero();
SuperHero hero1 = new Spiderman();
SuperHero hero2 = new Wolverine();
hero.useSuperPower();
hero1.useSuperPower();
hero2.useSuperPower();

//example 2
Spiderman test = new Spiderman();
Wolverine test2 = new Wolverine();
test.useSuperPower();
test2.useSuperPower();
}
}

动态多态性强大的最简单的例子是在集合中。我们可以将不同类的对象收集在一起,并使用它们,只要它们都共享一个父接口。例如:

List<SuperHero> avengers = new ArrayList<>();
avengers.add(new Spiderman());
avengers.add(new Wolverine());
System.out.println("Avengers Assemble!");
for(SuperHero hero : avengers){
hero.useSuperPower();
}

它还允许API非常灵活。我们可以创建需要一个接口的方法,但稍后会将子类型的对象传递给它们,而不必重新创建该方法。例如:

public void usePower(SuperHero hero){
hero.useSuperPower();
}

在这里,我们可以用扩展SuperHero的对象来调用这个方法。(这个例子有点蹩脚,因为我们可以直接调用useSuperPower()方法,但希望你能理解。)

基本上,多态性允许我们创建所有做相同事情但做不同事情的类,然后(几乎)可互换地使用它们。

您可能永远不会直接使用示例1然而,无论如何,你可能会出现在示例1中(因此动态多态性有价值)。

假设我们两个正在一起编写一个游戏,而你已经写下了问题中的超级英雄雇佣制。在我这边,我写了一个名为JusticeLeagueScheduler的类,方法是:

public JusticeLeagueScheduler {
public static Superhero getAvaiableHero() {
// ...
}
}

这让你可以接触到一个可以帮助拯救这一天的超级英雄。此外,假设getAvailableHero()方法的长度荒谬地,因为它需要考虑每个超级英雄的使用频率、Logan当前的BAC、Peter Parker的学校时间表等。

当你调用这个方法时,你会这样做:

SuperHero superhero = JusticeLeagueScheduler.getAvailableHero();

在这一点上,您不知道您拥有哪个英雄,只知道它是类SuperHero的实例或子类。因此,您处于示例1中的情况。不能在superhero上调用Wolverine方法,因为它可能是Wolverine,但也可能不是。只能在superhero上调用类SuperHero(或其父类型Object)定义的方法。

然而,它仍然是原来的实例。如果我的方法向你返回一个Wolverine实例,而你调用userSuperPower(),你会得到"Hack and Slash",尽管你事先无法预测。

在示例1中,herohero1hero2都属于SuperHero类型。在不同的SuperHero对象上使用相同的方法时,它们的行为方式不同。这就是多态性。

然而,在示例2中,herohero1hero2都是不同类型的。所以,这个例子并没有证明多态性。

是的,您节省了自己的时间和代码。

Java 中的

多态性

java中的多态性是一个概念,通过它我们可以执行单个通过不同的方式采取行动。多态性来源于两个希腊单词:多边形和变形。单词"poly"的意思是许多,而"morphs"的意思则是形式。所以多态性意味着多种形式。

java中有两种类型的多态性:编译时多态性以及运行时多态性。我们可以通过以下方式在java中执行多态性方法重载和方法重写。

如果您在java中重载静态方法,它就是compile的例子时间多态性。在这里,我们将关注中的运行时多态性Java语言

Java 中的运行时多态性

运行时多态性或动态方法调度是这样一个过程对重写方法的调用在运行时解析,而不是编译时。

在此过程中,通过引用调用重写的方法超类的变量。要调用的方法的确定基于引用变量所引用的对象。

让我们先了解一下运行时多态性之前的upcasting。

现在让我们举一个例子,您需要将一个Spiderman对象转换为SuperHero类,如果您在没有动态多态性的情况下实例化,您是否能够做到这一点。答案是否定的。

阅读更多关于CollectionAPI的信息,您就会知道为什么我们需要动态多态性。

阅读此答案以理解概念。

因此,如果您执行以下操作:

SuperHero hero1 = new Spiderman();
SuperHero hero2 = new Wolverine();

你也可以做:

SuperHero hero3 = new Spiderman();
hero3 =(Superhero) hero2;

如果你不应用多态性,你将无法做到这一点。

最新更新