为什么要为对象使用超类引用?

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

rge*_*man 5

多态性的优势是,当你可以调用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,并且多态将起作用,但这将是一个糟糕的设计.并非所有音乐家都可以在吉他上弹奏弦乐.