1 . 什么是多态?
多态指的是同类型的对象,表现出的不同状态。
2 . 多态的表现形式:
会进行自动类型转换!!! Student转为Person
Person p = new Student();
Person p = new Teacher();
3 . 多态的前提
4 . 例:
调用: 此时调用就可以随便传里面的参数!!
5 . 多态中调用成员的特点:
5 . 1 调用成员变量:
调用成员变量: 编译看左边,运行也看左边。
编译看左边:javac 编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功;如果没有,编译失败。运行也看左边:java 运行代码时,实际上直接获取的是左边父类中成员变量的值。
5 . 2 调用成员方法:
调用成员方法: 编译看左边,运行也看右边。
编译看左边:javac 编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功;如果没有,编译失败。运行看右边:java 运行代码时,实际上运行的是右边子类中的方法。(因为如果子类中进行了方法的重写,是会覆盖父类中的方法的)
6 . 注意:
Animal a = new Dog();
Dog a = new Dog();
两者区别是:
- 第一个如果要调用 a 的成员变量,会直接到父类 Animal中找。
- 而第二个会先到子类 Dog 中找,找不到再去父类中找。
7 . 多态的优势和劣势:
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
- 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与遍历。
此时会存在弊端:不能调用子类的特有功能(因为编译看左边,会去父类里找,没有直接报错!!!)
解决方案: 再变回子类型就可以了!!!
Dog d = (Dog)a; // 将 a(Animal类型)转化为 Dog类
注意: 不能乱转 ,比如不能让 Dog 转化成 Cat
Animai a = new Dog();
Cat c = (Cat) a ; // 不能这样转!!!!
// 只能 Dog d = (Dog) a
所以可以做如下判断:
新特性,可以合在一起写: