第三章
十.多态
关于java语言当中的多态语法机制:
1.Animal、Cat、Bird三个类之间的关系:
Cat继承Animal
Bird继承Animal
Cat和Bird之间没有任何继承关系
2.面向对象三大特征:封装、继承、多态
3.关于多态中涉及到的几个概念:
-
向上转型(upcasting)
子类型-->父类型
又被称为:自动类型转换
-
向下转型(downcasting)
父类型-->子类型
又被称为:强制类型转换【需要加强制类型转换符】
-
需要记忆:
无论是向上转型还是向下转型,两种类型之间必须要有继承关系
没有继承关系,程序是无法编译通过的
使用多态语法机制:
1.Animal和Cat之间存在继承关系,Animal是父类,Cat是子类
2.Cat is a Animal【合理的】
3.new Cat()创建的对象的类型是Cat,a2这个引用的数据类型是Animal,可见他们进行了类型转换,子类型转换成父类型,称为向上转型/upcasting,或者称为自动类型转换
4.java中允许这种语法:父类型引用指向子类型对象
1.java程序永远都分为编译阶段和运行阶段
2.先分析编译阶段,在分析运行阶段,编译无法通过,根本是无法运行的
3.编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class字节码当中有move()方法,所以编译通过了。这个过程我们称为静态绑定,编译阶段绑定。只有静态绑定成功之后才有后续的运作
4.在程序运行阶段,JVM堆内存当中真是创建的对象是Cat对象,那么以下程序在运行阶段一定会调用Cat对象对象的move()方法,此时发生了程序的动态绑定,运行阶段绑定
5.无论是Cat类有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为底层真实对象就是Cat对象
6.父类型引用指向子类型对象这种机制导致程序存在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这种机制可以成为一种多态语法机制
7.什么时候需要向下转型呢?
-
当调用的方法是子类型中特有的,在父类型当中不存在,必须进行向下转型
8.向上转型只要编译通过,运行一定不会出错:Animal a = new Cat()
向下转型编译通过,运行可能错误:Cat c3 = (Cat) a3
9.怎么避免向下转型出现ClassCastException呢?
-
语法格式:
(引用 instanceof 数据类型名)
-
以上运算符的执行结果类型是布尔类型,结果可能是true/flase
-
关于运算结果true/flase:
true表示:
a这个引用指向对象是一个Animal类型
flase表示:
a这个引用指向的对象不是一个Animal类型
10.java规范中要求:在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免ClassCastException异常的发生
11.多态在实际开发中的作用,以下以主任喂养宠物为例说明多态的作用:
(1)分析:主人喂养宠物这个场景要实现,需要进行类型的抽象:
-
主人【类】
-
主人可以喂养宠物,所以主人有喂养这个动作
-
宠物【类】
-
宠物可以吃东西,所以宠物有吃东西这个动作
(2)面向对象编程的核心:定义好类,然后将类实例化为对象,给一个环境驱使一下,让各个对象之间协作起来形成一个系统
(3)多态的作用是什么?
降低程序的耦合度,提高程序的扩展力
能使用多态尽量使用多态
父类型引用指向子类型对象
核心:面向抽象编程,尽量不要面向具体编程