课后作业

动手实验1:

当通过super()方法调用父类的构造方法时,该方法必须是子类构造方法的第一句。

 

 

动手实验2

 

类型转换:

 

问题如下图:

回答:第二句会出错,第四句会出错。原因:虽然第一句已经把子类对象d赋值给父类对象m,但是m仍旧是父类的对象,所以用父类对象再次给子类对象赋值时需要加上强制类型转换。第四句是因为同级不同的子类之间不能互相赋值。

动手实验三:

问题:下面的代码输出什么结果?为什么?

输出结果:100  200  200  200  201

原因:前俩个结果是因为前俩个对象全是父类引用指向父类对象,子类引用指向子类对象,因此输出100 200然后子类对象赋值给父类对象,所以该父类对象是父类引用指向子类,此时,子类中对父类方法有覆盖,所以该父类对象调用子类中重新定义的方法,所以输出200,但是不管子类对父类中属性是否覆盖,该父类对象仍然引用自身原有的属性,所以parent.myValue++是对父类中的myValue进行++,后一句加上了强制类型转换,所以是对子类中属性进行操作,所以最后输出的是201.

引用规则:

一.当父类引用指向子类对象时:

1、若子类覆盖了某方法,则父类引用调用子类重新定义的新方法

2、若子类未覆盖某方法,则父类引用调用父类本身的旧方法

3、若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性

4、若子类未覆盖某属性,则父类引用调用父类本身的旧属性

5、父类引用不能访问子类新定义的方法

二.子类引用指向自身对象时:

1、若子类覆盖了某方法,则子类引用调用子类重新定义的新方法

2、若子类未覆盖某方法,则子类引用调用父类本身的旧方法

3、若子类覆盖了某属性,则子类引用调用子类重新定义的新属性

4、若子类未覆盖某属性,则子类引用调用父类本身的旧属性

5、子类引用可以访问子类新定义的方法

 

 

原文地址:https://www.cnblogs.com/zhangliqiangvictory/p/7810093.html