type
status
date
slug
summary
tags
category
icon
password
多态的概述
同一对象,在不同时刻表现出来的不同形态。
同一个接口,使用不同实例而执行不同的操作。
假设有动物类;猫类和狗类是对动物类的继承
这里动物类表现出多种不同的形态,即多态。
使用多态的前提和体现
使用多态的前提
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象,接口可以定义变量,实例:接口 A = new 实现接口的子类();
多态中成员访问特点
- 构造方法:同继承一样,子类会通过super访问父类构造方法。
- 成员变量:编译看左边(父类),执行看左边(父类)。
- 成员方法:编译看左边(父类),执行看右边(子类)。
- 编译看左边:看父类是否有成员变量或方法,没有直接报错。
- 二者为什么不一样呢?成员方法有重写,变量无重写。
多态的好处和弊端
好处:提高了程序扩展性,具体体现在:定义方法的时候,使用父类型作为参数,该方法可以接收任意子类对的。
弊端:不能调用子类特有的成员(成员方法,成员变量)。
对于传对象的方法的写法
多态中的转型:
- 向上转型:从子到父,父类引用指向子类对象。
- 向下转型:从父到子,父类引用转为子类对象。
向上转型:
类似「隐式转换」,
Fu f = new Zi();
即多态的形式创建对象。如果要调用子类特有方法:
1.直接子类创建对象。
2.向下转型,将父类引用装换成子类对象,通过强制类型装换。
Zi z= (Zi) fu;
这样所有同名的方法都会被调用。
引用和创建对象的回顾
类 A = new 类()
等号左边叫「引用」。右边叫「创建对象」。
类A引用 指向一个类对象
多态中的转型存在的风险
如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,会出现
ClassCastException
a最开始记录的是Cat类型,作为对象参数传入useAnimal()中,此时将Cat类型强转为Dog类型。猫和狗不是同一种类型。
避免强转出现的问题
使用关键字
instanceof
判断左边和右边是否是同一类型,是则返回true,否则返回false。在强转时加个判断若是类型相同再转。