多态实验:基类——子类成员

class Instrument {
    private String instrumentName;
    Instrument(){
        instrumentName = "instrument";
    }
    public String toString() {return instrumentName;}
}
class Wind extends Instrument{
    Wind(){
        instrumentName = "Wind";
    }
}
public class Music3{
    public static void main(String[] args){
        Instrument ii = new Instrument();
        System.out.println("I am "+ ii);
        Instrument ww = new Wind();
        System.out.println("I am "+ ww);
    }
}

结果:编译不通过,编译错误,子类无法访问父类的private成员instrumentName

修改一:

class Instrument {
    protected String instrumentName;
    Instrument(){
        instrumentName = "instrument";
    }
    public String toString() {return instrumentName;}
}
class Wind extends Instrument{
    Wind(){
        instrumentName = "Wind";
    }
}
public class Music3{
    public static void main(String[] args){
        Instrument ii = new Instrument();
        System.out.println("I am "+ ii);
        Instrument ww = new Wind();
        System.out.println("I am "+ ww);
    }
}

结果:java Music3

  I am instrument

  I am Wind

分析:执行java Music3时发生以下动作:

  1. main()函数执行,先new一个Instrument对象,调用其构造函数将instrumentName设置为“instrument”;

  2. 紧接着prinln打印 I am + instrument,这里定义toString()为打印instrumentName成员,这里是“instrument”;所以最终打印I am instrument;

  3. new 一个Wind对象,并赋值给Instrument 对象ww,发生向上转型;

    3.1 Wind继承自Instrument,先调用Instrument构造函数,将instrumentName设置为"instrument";

    3.2 接着调用Wind的构造,再把instrumentName 设置(实际上是修改了)为“Wind”

  4. 通过System.out.println("I am "+ ww)打印,此时toString还是父类的那个toString,instrumentName还是父类的,但是已经被Wind子类对象修改为"Wind"

    所以打印出I am Wind

class Instrument {
    private String instrumentName;
    Instrument(){
        instrumentName = "instrument";
    }
    public String toString() {return instrumentName;}
}
class Wind extends Instrument{
    private String instrumentName;
    Wind(){
        instrumentName = "Wind";
    }
    public String toString() {return ("son:"+instrumentName);}
}
public class Music3{
    public static void main(String[] args){
        Instrument ii = new Instrument();
        System.out.println("I am "+ ii);
        Instrument ww = new Wind();
        System.out.println("I am "+ ww);
    }
}

运行结果:

结果:java Music3

  I am instrument

  I am son:Wind

子类重载了父类的成员变量和方法。

原文地址:https://www.cnblogs.com/liuhailong0112/p/5412207.html