继承中的多态问题

相关概念

1.一个对象变量可以指示多种实际类型的现象被称为多态。在继承中的多态体现在:如果一个Employee类有三个子类,Manager,Secretary和Programmer,那么一个Employee类型的对象引用可以指示Manager或Secretary或Programmer,根据实际情况而定。
2.有一个用来判断是否应该设计为继承关系的简单规则,就是“is-a”规则,它表明子类的每个对象也是超类的对象,例如:每个经理都是雇员。“is-a”规则的另一种表述法是置换法则,它表明程序中出现超类对象的任何地方都可以用子类对象置换。

注意问题

eg1:

Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;

在这个例子中,变量staff[0]与boss引用同一个对象,但编译器将staff[0]看成Employee对象,所以boss.setBonus(500)是可以的,但是staff[0].setBonus(500)是错误的。因为setBonus不是Employee类的方法。然而,不能将超类的引用赋给子类变量,如Manager m = staff[i]。

eg2:子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换。

Manager[] managers = new Manager[10];
Employ[] staff = managers;

这样完全没问题,managers和staff引用的是同一个数组

staff[0] = new Employee(...)

这样编译器也不会报错,但是其实我们把一个员工归入了经理行列中,在运行managers[0].setBonus(100)的时候,将会调用一个不存在的实例域,进而抛出ArrayStoreException异常。

posted @ 2019-03-07 22:30  WongJeffung  阅读(263)  评论(0编辑  收藏  举报