del*_*via 3 java oop polymorphism
鉴于以下代码:
public class Musician {
public void play() {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
.
public class Drummer extends Musician {
public void turnsDrumStick() {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
.
public class Guitarist extends Musician {
public void strummingStrings() {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用多态来执行以下操作:
Musician m1 = new Guitarist();
Musician m2 = new Drummer();
m1 = m2;
Run Code Online (Sandbox Code Playgroud)
但是,我看不到子类的方法:
m1.strummingStrings(); //COMPILATION ERROR!
Run Code Online (Sandbox Code Playgroud)
如果我使用:
Guitarist m1 = new Guitarist();
Run Code Online (Sandbox Code Playgroud)
不是更好吗?使用Musico类型引用子类的对象有什么好处?m1 = m2;例如,我可以归因于一种可能性吗?还是有其他优势?
我看到这篇文章,但我仍然感到困惑:使用超类来初始化子类对象java
多态性的优势是,当你可以调用play()的任何 Musician,不管它是一个Guitarist,一个Drummer,或者任何其他的子类Musician,你可能不会创造呢.
Musician m1 = new Guitarist();
Musician m2 = new Drummer();
m1.play();
m2.play();
Run Code Online (Sandbox Code Playgroud)
这可能会产生类似的结果
Guitarist strumming
Drummer drumming
Run Code Online (Sandbox Code Playgroud)
如果您覆盖play()两个子类中的方法.这样,调用的代码play()不需要知道Musician它实际上是哪个实现,只是它是a Musician并且它保证有一个play()方法.
多态的优点是能够调用子类方法,例如strummingStrings来自超类引用,因为该方法仅存在于子类中.它不能保证存在于超类中.如果需要调用仅类的子类方法strummingString,则需要子类引用.
您可以strummingStrings在超类中定义Musician,并且多态将起作用,但这将是一个糟糕的设计.并非所有音乐家都可以在吉他上弹奏弦乐.
| 归档时间: |
|
| 查看次数: |
811 次 |
| 最近记录: |