加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:17:51 所属栏目:Java 来源:网络整理
导读:参见英文答案 What does it mean to “program to an interface”?????????????????????????????????????32个 鉴于以下代码: public class Musician { public void play() { // do something }} . public class Drummer extends Musician { public void tur
参见英文答案 > What does it mean to “program to an interface”?????????????????????????????????????32个
鉴于以下代码:

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 m1 = new Guitarist();
Musician m2 = new Drummer();
m1.play();
m2.play();

这可能会产生类似的结果

Guitarist strumming
Drummer drumming

如果你覆盖两个子类中的play()方法.这样,调用play()的代码不需要知道它实际上是Musician的哪个实现,只是它是一个音乐家并且保证有一个play()方法.

从多类引用中调用子类方法(例如strummingStrings)不是多态的优势,因为该方法仅存在于子类中.它不能保证存在于超类中.如果需要调用仅子类的方法(如strummingString),则需要子类引用.

您可以在超类音乐家中定义strummingStrings,并且多态将起作用,但这将是一个糟糕的设计.并非所有音乐家都可以在吉他上弹奏弦乐.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读