首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的动态多态性有什么好处?

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

Stack Overflow用户
提问于 2017-01-06 07:59:00
回答 4查看 2.1K关注 0票数 0

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

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

代码语言:javascript
复制
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();
    }
}
EN

回答 4

Stack Overflow用户

发布于 2017-01-06 08:12:11

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

代码语言:javascript
复制
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非常灵活。我们可以创建需要一个接口的方法,但随后将其传递给子类型的对象,而不必重新创建该方法。例如:

代码语言:javascript
复制
public void usePower(SuperHero hero){
    hero.useSuperPower();
}

在这里,我们可以用扩展了SuperHero的object来调用这个方法。(这个例子有点差劲,因为我们可以直接调用useSuperPower()方法,但希望您能明白这一点。)

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

票数 6
EN

Stack Overflow用户

发布于 2017-01-06 08:04:57

您可能永远不会直接使用example 1。但是,无论如何您可能会在示例1中结束(因此动态多态是有价值的)。

假设我们两个人正在一起编写一个游戏,并且您已经编写了问题中的超级英雄层级结构。在我这边,我用下面的方法编写了一个名为JusticeLeagueScheduler的类:

代码语言:javascript
复制
public JusticeLeagueScheduler {
    public static Superhero getAvaiableHero() {
        // ...
    }
}

这样你就能接触到一个能拯救世界的超级英雄了。此外,假设方法getAvailableHero()长得离谱,因为它需要考虑每个超级英雄被使用的频率、Logan当前的BAC、Peter Parker的学校时间表等。

当您调用该方法时,您将这样做:

代码语言:javascript
复制
SuperHero superhero = JusticeLeagueScheduler.getAvailableHero();

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

但是,它仍然是它的实例。如果我的方法返回一个Wolverine实例给你,而你调用了userSuperPower(),你会得到"Hack and Slash",即使你事先没有预料到这一点。

票数 0
EN

Stack Overflow用户

发布于 2017-01-06 08:11:10

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

但是,在示例2中,herohero1hero2都属于不同的类型。所以,这个例子并没有演示多态性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41496803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档