黑马程序员Java个人笔记
BV17F411T7Ao
p129~132
目录
多态
多态调用成员的特点
调用成员变量
调用成员方法
理解
多态的优势
解耦合
多态的弊端
解决方案:强制类型转换
instanceof
jdk14新特性,将判断和强转放一起
总结
多态
多态调用成员的特点
- 成员变量调用:编译看左边,运行也看左边
- 成员方法调用:编译看左边,运行看右边
调用成员变量
- 编译看左边:javac 编译代码时,会看左边的父类中有没有这个变量,有则编译成功,没有则失败
- 运行也看左边:java 运行代码的时候,实际获取的就是左边父类中成员变量的值
调用成员方法
- 编译看左边:javac 编译代码的时候,会看左边的父类中有没有这个方法,有则成功,没有则失败
- 运行看右边:java 运行代码的时候,实际上运行的是子类中的方法
理解
Animal a = new Dog();
- 现在用 a 去调用变量和方法。而 a 是 Animal 类型的,所以默认都会从 Animal 这个类中去找
- 成员变量:因为是 Animal 类型的,看左边
- 成员方法:如果子类对方法进行了重写,那么在虚方法中是会把父类的方法进行覆盖的
- 编译看左边,因为 a 是Animal 类型的,看父类有没有方法
- 运行看右边,因为 Animal 中的方法被覆盖了
多态的优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
- 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利
解耦合
- 如下代码,当过了几天,不想让学生去工作了,让老师去工作,只需要把创建对象的这一部分修改就行了
- 在调用 work 方法时,运行的是修改之后的老师这个类的方法
多态的弊端
- 不能调用子类特有的功能
解决方案:强制类型转换
- 变回子类类型
instanceof
- 变量名 instanceof 类名,用来判断变量所记录的对象是不是对应的类型