This question already has answers here:
What does it mean to “program to an interface”?

(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时,无论是GuitaristDrummer还是您可能尚未创建的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