This question already has answers here:
What does it mean to “program to an interface”?
(32个答案)
3年前关闭。
给出以下代码:
。
。
我可以使用多态来执行以下操作:
但是,我看不到子类的方法:
如果我使用:
会不会更好?使用Musico类型引用子类的对象有什么好处?例如,是否有可能我可以将
我看到了这篇文章,但我仍然感到困惑:Using superclass to initialise a subclass object java
这可能会输出类似
如果您在两个子类中都覆盖了
能够从超类引用中调用诸如
您可以在超类
(32个答案)
3年前关闭。
给出以下代码:
public class Musician {
public void play() {
// do something
}
}
。
public class Drummer extends Musician {
public void turnsDrumStick() {
// do something
}
}
。
public class Guitarist extends Musician {
public void strummingStrings() {
// do something
}
}
我可以使用多态来执行以下操作:
Musician m1 = new Guitarist();
Musician m2 = new Drummer();
m1 = m2;
但是,我看不到子类的方法:
m1.strummingStrings(); //COMPILATION ERROR!
如果我使用:
Guitarist m1 = new Guitarist();
会不会更好?使用Musico类型引用子类的对象有什么好处?例如,是否有可能我可以将
m1 = m2;
赋予属性?还是还有其他优势?我看到了这篇文章,但我仍然感到困惑:Using superclass to initialise a subclass object java
最佳答案
当您可以在任何play()
上调用Musician
时,无论是Guitarist
,Drummer
还是您可能尚未创建的Musician
的任何其他子类,多态性的优势都会显现。
Musician m1 = new Guitarist();
Musician m2 = new Drummer();
m1.play();
m2.play();
这可能会输出类似
Guitarist strumming
Drummer drumming
如果您在两个子类中都覆盖了
play()
方法。这样,调用play()
的代码无需知道它实际上是Musician
的哪种实现,只需知道它是Musician
并保证具有play()
方法即可。能够从超类引用中调用诸如
strummingStrings
之类的子类方法并不是多态性的优势,因为该方法仅存在于子类中。它不能保证存在于超类中。如果需要调用仅子类的方法,例如strummingString
,则需要子类引用。您可以在超类
strummingStrings
中定义Musician
,多态将起作用,但这将是一个糟糕的设计。并非所有的音乐家都能弹吉他弦。10-07 18:55