• 06-继承与多态课后动手动脑


    一.

    运行以下测试代码:

    运行结果:

    原因分析:

    当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象决定。对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。(数据变量不参与多态运算)

    在第三个输出语句中,对象是Child类型,所以调用的是child的方法,所以输出200;第四个输出语句,parent的myValue自增,但是变量不进行多态,所以还是调用的child的方法,输出200;第五个输出语句parent被强制转化为Child类型,也就是对Child的myValue进行自增运算,所以输出值是201。

    二.

    下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

    m=d;

    d=m;

    d=(Dog)m;

    d=c;

    c=(Cat)m;

    第二句和第四句会报错

    原因:

    子类对象不能直接赋值给父类变量,需要进行强制转换。

     m=d是可以的,表示定义了一个Mammal类型的引用,指向新建的 Dog类 型的对象,即父类的引用指向了自己的子类的对象。由于 Dog是继承自它的父类Mammal,所以Mammal类型的引用是可以指向Cat类型的对象的。。但是d=m不行,因为不能把父类对象引用赋给子类对象引用变量,除非进行强制转化,也就是向下转型(父类转子类)d=(Dog)m。

     d=c也会引起编译错误,父类型的引用必须指向子类的对象,即指向谁才能转换成谁,则因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的,子类之间不能转换。

  • 相关阅读:
    张五常:思考的方法
    David Foster Wallace on Life and Work
    SQL SERVER SQL Agent服务使用小结
    js大全
    中国载人航天工程七大系统
    vc 编译遇到问题
    学习Excel技巧
    使用Request.ServerVariables获取环境变量
    c# 字符常用函数
    SQL数据同步
  • 原文地址:https://www.cnblogs.com/mqlblog/p/7804173.html
Copyright © 2020-2023  润新知