Java 20 面向对象--多态

107 阅读2分钟

1 . 什么是多态?

多态指的是同类型的对象,表现出的不同状态。

2 . 多态的表现形式:

0909.png

会进行自动类型转换!!! Student转为Person

Person p = new Student();
Person p = new Teacher();  

3 . 多态的前提

0910.png

4 . 例:

0911.png

调用: 此时调用就可以随便传里面的参数!!

0912.png

5 . 多态中调用成员的特点:

5 . 1 调用成员变量:

调用成员变量: 编译看左边,运行也看左边。

  • 编译看左边: javac 编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功;如果没有,编译失败。
  • 运行也看左边: java 运行代码时,实际上直接获取的是左边父类中成员变量的值。

5 . 2 调用成员方法:

调用成员方法: 编译看左边,运行也看右边。

  • 编译看左边: javac 编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功;如果没有,编译失败。
  • 运行看右边: java 运行代码时,实际上运行的是右边子类中的方法。(因为如果子类中进行了方法的重写,是会覆盖父类中的方法的)

6 . 注意:

Animal a = new Dog();
Dog a = new Dog();

两者区别是:

  • 第一个如果要调用 a 的成员变量,会直接到父类 Animal中找。
  • 而第二个会先到子类 Dog 中找,找不到再去父类中找。

7 . 多态的优势和劣势:

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

0913.png

  • 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与遍历。
    • 此时会存在弊端:不能调用子类的特有功能(因为编译看左边,会去父类里找,没有直接报错!!!)

解决方案: 再变回子类型就可以了!!!

Dog d = (Dog)a; // 将 a(Animal类型)转化为 Dog类

注意: 不能乱转 ,比如不能让 Dog 转化成 Cat

Animai a = new Dog();
Cat c = (Cat) a ; // 不能这样转!!!!
// 只能 Dog d = (Dog) a 

所以可以做如下判断:

0914.png

新特性,可以合在一起写:

0915.png