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类,这是不可能的,子类之间不能转换。

原文地址:https://www.cnblogs.com/mqlblog/p/7804173.html