我正在学习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();
}
}发布于 2017-01-06 08:12:11
动态多态性强大的最简单示例是在集合中。我们可以将不同类的对象收集在一起,并以相同的方式使用它们,只要它们都共享一个父接口。例如:
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的object来调用这个方法。(这个例子有点差劲,因为我们可以直接调用useSuperPower()方法,但希望您能明白这一点。)
基本上,多态性允许我们创建类,这些类都做相同的事情,但做的不同,然后(几乎)互换地使用它们。
发布于 2017-01-06 08:04:57
您可能永远不会直接使用example 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",即使你事先没有预料到这一点。
发布于 2017-01-06 08:11:10
在示例1中,hero、hero1和hero2都是SuperHero类型。在不同的SuperHero对象上使用相同的方法时,它们的行为方式不同。这就是多态性。
但是,在示例2中,hero、hero1和hero2都属于不同的类型。所以,这个例子并没有演示多态性。
https://stackoverflow.com/questions/41496803
复制相似问题