一、概述
- 多态是继封装、继承之后,面向对象的第三大特性
- 多态: 是指同一行为,具有多个不同表现形式。
//父类引用指向子类对象
父类类型 变量名 = new 子类名称();
或
接口名称 对象名 = new 实现类名称();
1.1 多态中成员方法调用
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。
- 访问成员方法:
看new 的是谁(类 接口),则优先(重名情况)用谁,没有 则向上找
1.2 多态中成员变量调用
只能调用父类中的成员变量
- 访问成员变量
1.直接通过对象名称访问:看(声明语句)等号左边是谁(类 接口),优先用谁,没有则向上找
2.间接通过成员方法访问:看方法属于谁(类,接口),优先(重名情况)用谁,没有则向上找
1.3 多态的好处
1.4 向上转型
- 多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
- 当父类引用指向一个子类对象时,便是向上转型。
使用格式(和多态一样)
父类类型 变量名 = new 子类类型();
Animal a = new Cat();
1.6 向下转型
- 父类类型向子类类型向下转换的过程,这个过程是强制的。
- 一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。
使用格式 (类似基本类型强制转换)
子类类型 变量名 = (子类类型) 父类变量名;
Cat c =(Cat) a;
为什么要向下转型?
- 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做向下转型。
1.7 向下转型异常
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:
变量名 instanceof 引用数据类型
//如果变量属于该引用数据类型,返回true。
//如果变量不属于该引用数据类型,返回false。
public class Demo08Polymorphism {
public static void main(String[] args) {
//多态的写法
//父类的引用,指向了子类的对象
Fu obj = new Zi();
System.out.println(obj.num);
//instanceof 检查obj是否为子类对象的引用
if(obj instanceof Zi){
Zi objZi = (Zi)obj;
System.out.println(objZi.num);
}
}
}