多态
多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态
对象多态:
People p1 = new Student();
People p2 = new Teacher();
在这里人可以是学生对象,也可以是老师对象,这就是对象多态
行为多态:
People p1 = new Student();
p1.run();
People p2 = new Teacher();
p2.run();
编译看左边,运行看右边(看的是初始化对象等号左右边,编译时看左边people,运行时看的是右边实际)
在这同样是调用run方法,可能老师跑得快,学生跑得慢,这就是行为多态
多态的前提
- 有继承/实现关系;存在父类引用子类对象;存在方法重写
多态的注意事项
-
多态是对象,行为的多态,java中的属性(成员变量)不谈多态(即使子类中有变量也输出的是父类)
使用多态的好处
- 在多态形式下,右边对象是解耦合的,更便于扩展和维护
例如学生寝室里面的床帘:
有的是免安装的,那支架之间就是直接连好的,这个时候如果其中一根支架杆子有问题就需要全部退货去换,因为他们是高度耦合的(“焊死的”),但是如果选择那种自己手动安装的,就是一个一个杆子,就是解耦合的
高耦合的设计,各部件之间紧密依赖。而解耦合的设计就是模块化的,每个部分互相独立,不好用了就更换,不会影响到其他部分
解耦合好处:
- 易维护,易扩展,易复用,灵活性
多态存在的问题:
不能直接调用子类的独有方法
多态下的类型转换问题
类型转换
- 自动类型转换:父类 变量名 = new 子类()
- 强制类型转换:子类 变量名 = (子类)父类变量
强制类型转换的一个注意事项
- 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译截断不会报错
- 运行时,如果发现对象的真实类型和强转后的类型不同,会报错(类型转换异常)
- 强制转换前,建议可以使用instanceof判断当前对象的真实类型:对象 instanceof 类型