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

Fin*_*_tv 0 java oop polymorphism dynamic

我正在研究我的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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

List<SuperHero> avengers = new ArrayList<>();
avengers.add(new Spiderman());
avengers.add(new Wolverine());

System.out.println("Avengers Assemble!");
for(SuperHero hero : avengers){
    hero.useSuperPower();
}
Run Code Online (Sandbox Code Playgroud)

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

public void usePower(SuperHero hero){
    hero.useSuperPower();
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们可以使用扩展SuperHero的对象来调用此方法.(这个例子有点蹩脚,因为我们可以直接调用该useSuperPower()方法,但希望你明白这一点.)

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