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


    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

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

  • 相关阅读:
    【数据库】-数据库显示不允许保存更改
    C#编程:从控制台读取数字的两种方式
    【终结版】C#常用函数和方法集汇总
    运行supervisord -c /etc/supervisor/supervisord.conf 出错,解决办法
    supervisord监控服务必备命令
    【持续更新中···】Linux下的小技巧
    运行supervisorctl reload报错解决方法
    ASP.NET Core 发布 centos7 配置守护进程
    【C++】std::是什么?
    DNS查询相关
  • 原文地址:https://www.cnblogs.com/liuhailong0112/p/5412207.html
Copyright © 2020-2023  润新知