面向对象中的多态,理解为:
- 一个对象拥有多种形态
- 一个方法具有多种形态(方法的重载,覆盖)
这里,主要讲解对象的多态。
这里做一个简单的比喻:一个Student类继承了Human类,那么该Student可以是Student,也可以是Human,就有了2种形态,这就是对象的多态。
多态的前提
多态的前提,是继承或者实现接口。
多态的实现
多态的实现,依赖于转型。
可以向上转型,以及向下转型,即:灵活的转换身份。
多态的好处
多态提高了代码的可扩展性,
例如,公司有10万个员工,这里有一个员工类,而员工的工作各不相同,员工在工作时,有的是领导、有的是程序员、有的是清洁工,而在调度时,它们都是员工,参数的类型是相同的,所以调度起来很方便。
向上转型
这里把继承和接口分开讲解
继承中的向上转型
在继承中,子类转换为父类,例如以下语法
Human human = new Student();
在该语法中,new的是Student,但转换为Human,这让它看起来很奇怪,既不是完整的Student,也不是Human。
它最大的特点是:语法上是父类,如果它的方法被子类重写,那么优先使用重写后的方法。
因为语法是父类,那么无法使用子类特有方法,而属性无法被重写(即使同名重新赋值),所以属性仍是父类的属性。
如何使用子类的属性?向上转型后,如果子类属性重写了,需要使用子类属性,那么父类应该有getter/setter,以及子类重写getter/setter,那么此时就可以通过getter/setter使用子类的属性了。
接口的向上转型
接口不能直接创建,如果使用接口接收一个实现类,那么接口实际使用的是实现类的方法。
接口名称 对象名 = new 实现类名称(参数);
向下转型
接口无法强转为实现类,即无法向下转型。
继承时,如果在 new 使用的是子类,但向上转为父类,此时才符合强转规则,强转为子类后,语法变为子类,使用起来和真实的子类语法一致。
instanceof关键字
使用语法:
对象 instanceof 类名
该关键字,能判断某个对象是否属于继承于某个类(包括它本类)的实例
在向下转型时,我们应该判断某个类本身是否属于它的子类。例如
System.out.println(human instanceof Student); // true or false
假设human对象在 new 时,是Student,虽然向上转型为Human,但上述代码将输出true,所以这里我们可以使用instanceof判断能否向下转型。