输入不会一直传给孩子

时间:2019-06-25 15:49:54

标签: java inheritance

我对此代码有疑问:

    public class Musician {
        private String name;
        public String instrument;
        public Musician(String name, String instrument){
          this.name= name;
          this.instrument= instrument;
        }


        public String getInstrument() {
            return instrument; 
            }

        public String getName() {
            return name;
            }

        private String getClassName(){
            return "Musician ";
        }

        public void play(){
           System.out.println("[M] "+getClassName() + " plays music.");
        }

        public void printInfo(){
          play();
          System.out.println("[M] Class name: "+ getClassName());
          System.out.println("[M] Instrument: "+ getInstrument());
        }
    }

    public class RockMusician extends Musician{
        public String instrument;

        public RockMusician(String name, String instrument) {
            super(name, instrument);
            this.instrument= instrument + " and drums";
         }

        public String getClassName(){
            return " RockMusician ";
            }

        public void play(){
            System.out.println("[RM] "+ getClassName() + getName() + " breaks his "+ super.getInstrument() + "!");
        }
    }


public class IsraelyRockMusician extends RockMusician {
      public IsraelyRockMusician(String name, String instrument) {
            super(name, instrument);
           }
        public String getInstrument() {
            return instrument;
            }
        public String getName(){
            return super.getName() + " the king";
            }
        public String getClassName() {
            return " IsraelyRockMusician ";
            }


}

public class Testing {
        public static void func(Musician m){
                System.out.println("I've got a musician!");
        }
        public static void func(RockMusician m){
                System.out.println("I've got a rock musician!");
        }
        public static void main(String[] args) {
            Musician m3 = new IsraelyRockMusician("Chanoch", "guitar");
            m3.printInfo();
        }
}

我有IsraelRockMusician继承了RockMusician,后者继承了音乐家, 然后,我制作了一个音乐家m3,名称为“ chanoch”,乐器为“ guitar”

我激活了该方法,打印信息, 因为printInfo在父级-> RockMusician中,它本身包含3个方法-> play(),getClassName()和getInstrument(),

我的问题是,当方法showinfo运行时,播放将一直进行到被覆盖的方法,并显示“ [RM] IsraelyRock音乐人Chanoch国王打破了吉他!”, 现在可以了,但是下一行是“ [M]类名称:Musician”,这意味着getClassName被赋予“ Musician”,而Im问为什么自从该方法被覆盖以来为什么没有“ IsraeliRockMusician”。

很抱歉,这个问题有点朦胧。

2 个答案:

答案 0 :(得分:1)

应该使用以下代码代替对类名称进行硬编码的函数:

<bean id="southboundProvider"
                class="com.sdn.southbound.common.provider.SouthboundProvider">
        <argument ref="commonApi"/>
         <argument ref="dataBroker" />
         <argument ref="notificationService"/>
        </bean>

这样,如果您更改类名,则无需更新编写的方法。一个警告是,如果您对代码运行混淆工具,则类名可能会替换为随机字符。在这种情况下,您可以在类中创建一个const字符串,然后引用它。

答案 1 :(得分:1)

问题在于基类的方法具有私有访问权限。

private String getClassName(){
        return "Musician ";
    }

将其更改为公共/受保护,以便您可以覆盖它。