动态多态在Java中有什么好处?

时间:2017-01-05 23:59:00

标签: java oop dynamic polymorphism

我正在研究Java编程和面向对象编程。我一直对动态多态性的好处感到兴奋吗?

看看下面的示例程序。 为什么我会在示例2中使用示例1?

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();
    }
}

4 个答案:

答案 0 :(得分:5)

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

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 :(得分:0)

您可能永远不会直接使用示例1。 HOWEVER ,你可能最终会在示例1中结束(因此动态多态性具有价值)。

假设我们两个人正在一起编写一个游戏,你就像在问题中一样写了超级英雄的雇佣军。在我这边,我用方法编写了一个名为JusticeLeagueScheduler的类:

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

这使您可以访问可以帮助拯救一天的超级英雄。此外,假设方法getAvailableHero()荒谬长,因为它需要考虑每个超级英雄的使用频率,Logan目前的BAC,Peter Parker的学校日程安排等等。

当你打电话给那个方法时,你会这样做:

SuperHero superhero = JusticeLeagueScheduler.getAvailableHero();

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

然而,它仍然是它的实例。如果我的方法向您返回一个userSuperPower()实例,并且您调用<div class="post_list_medium_widget"> <div> <div class="feature-two-column medium-two-columns appear_animation left_post_align animate_css_stlye animate_start"> <div id="post-22346" class="post-22346 post type-post status-publish format-standard has-post-thumbnail hentry category-national"> <div class="image_post feature-item"> <a href="http://www.news.in" class="feature-link" title="Ashamed to be human"> <img width="400" height="260" src="http://www.image.in" class="attachment-medium-feature" onload="pagespeed.CriticalImages.checkImageForCriticality(this);"> </a> </div> </div> </div> </div> </div> ,即使您事先无法预测,也会得到“Hack and Slash”。

答案 2 :(得分:0)

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

但是,在示例2中,herohero1hero2都是不同的类型。因此,该示例并未证明多态性。

答案 3 :(得分:0)

是的,您可以节省时间并保存自己的代码。

  

Java中的多态性

     

java中的多态性是我们可以执行单一的概念   以不同的方式行动。多态性源自2个希腊词:   多边形和变形。单词&#34; poly&#34;意味着很多和&#34;变形&#34;表示形式。   因此,多态性意味着许多形式。

     

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

     

如果你在java中重载静态方法,那就是编译的例子   时间多态性。在这里,我们将重点关注运行时多态性   的java。

     

Java中的运行时多态性

     

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

     

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

     

让我们先了解运行时多态性之前的上传。

现在让我们举一个示例,您需要将一个Spiderman对象转换为SuperHero类,如果您在没有动态多态的情况下进行实例化,是否可以这样做。答案是否定的。

详细了解Collection API,您将了解我们为什么需要动态多态性。

阅读此answer以了解这一概念。

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

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

你也可以这样做:

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

如果您不应用多态,那么您将无法做到。