第七讲 继承与多态
一、为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
1. 由于子类是继承父类的,所以想用子类创建对象时,必须先创建父类的对象,这样子类才能有父类的属性和方法。在创建对象时如果父类的数据需要进行初始化,那么就需要调用父类的构造函数,使构造函数初始化。
2. 不能反过来
3. 原因:因为父类不知道子类有什么属性,而且反过来子类也不能得到父类初始化的变量。
二、运行以下测试代码:
1. 左边的程序运行结果是什么?
1. 你如何解释会得到这样的输出?
父类对象引用子类对象时,由于对象是子类型的,调用子类型的方法,所以最后一个parent.printValue()是201.
2. 计算机是不会出错的,之所以得到这样的运行结果也是有原因的那么从这些运行结果中,你能总结出Java的哪些语法特性?
语法特性:
(1)当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
(2)如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
(3)如果子类被当作父类使用,则通过子类访问的字段是父类的!
三、请使用javap查看编译器为TestPolymorphism.java生成的字节码指令,然后通过互联网搜索资料,尝试从底层开始理解Java编译器是如何为多态代码生成字节码指令,在程序运行过程中,多态特性又是如何实现的。
1.强制的:一种隐式做类型转换的方法。
2.重载的:将一个标志符用作多个意义。
3.参数的:为不同类型的参数提供相同的操作。
4.包含的:类包含关系的抽象操作。
多态依赖于类型和实现的分离,多用来把接口和实现分离。
四、1.多态对开发到底有什么好处呢?
当你要修改程序并扩充系统时,你需要修改的地方较少,对其它部分代码的影响较小!千万不要小看这两个“较”字!程序规模越大,其优势就越突出。
2.为什么它被看成是面向对象编程技术中最重要的特性之一?
子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,多态对程序的扩展具有非常大的作用。
四、这种编程有什么不合理的地方?
可以建立feedAnimals方法,让他去接收一个Animals数组,然后后面就可以只需要一句代码,就可以模拟出喂食过程。
五、下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?
m=d;
d=m;
d=(Dog)m;
d=c;
c=(Cat)m;
第二句和第四句会发生错误。
原因:基类对象赋值给子类对象必须要进行强制类型转换,所以第二句会发生错误;两个字类类型数据之间也不能够直接赋值。