我正在研究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();
}
}
答案 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中,hero
,hero1
和hero2
都是SuperHero
类型。在不同的SuperHero
对象上使用相同的方法时,它们的行为方式不同。那就是多态性。
但是,在示例2中,hero
,hero1
和hero2
都是不同的类型。因此,该示例并未证明多态性。
答案 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;
如果您不应用多态,那么您将无法做到。