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,并且多态将起作用,但这将是一个糟糕的设计.并非所有音乐家都可以在吉他上弹奏弦乐. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |