1.多态的概念
-
什么是多态?
一个事物在不同条件下呈现的不同状态
java中多态:
父类型引用指向子类型对象这种机制,导致程序存在编译阶段绑定和运行阶段绑定两种不同的状态,这种机制可以称之为多态语法机制。
-
为什么使用多态?
提高程序的复用性,节省资源
-
多态中涉及的概念
1.向上转型
子类型------->父类型
又被称为:自动类型转换
2.向下转型
父类型---->子类型
又被称为:强制类型转换【需要加强制转换符】
3.注意!!
不管是以上哪种转换类型,都需要有继承关系,如果没有继承关系,在编译阶段就过不去。(可以理解为,多态的使用,要在继承关系中进行)
2.多态的使用
Cat是子类,Bird是子类 ,Cat和Bird之间没有任何关系。
Animals是父类
子类重写了父类的move()方法
Cat.class类还有一个独有的getfish()方法。
*向上转型(自动转型)
什么时候用向上转型?
当调用的方法,父类中存在的时候,用向上转型。(多态一般)
向上转型,只要编译通过了,运行一定不会出错。
语法格式:
父类 父类的引用=new 子类();
编译看左边,运行看右边
Animals a1=new Cat(); // new Cat创建的对象是Cat子类型的,a1是Animals父类型的引用,
//可见进行了类型转换,子类型转父类型。
a1.move(); //实际执行的是Cat中的move方法。
*向下转型(强制转型)
1.什么时候需要用向下转型呢?
当调用的方法是子类中特有的,父类中不存在的,用向下转型。
2.语法:
引用 instanceof 子类数据类型;
子类数据类型 子类数据类型引用=(子类数据类型)父类数据类型引用
Animals a1=new Cat();
Cat cc=(Cat)a1; //把a1转换成Cat类型
cc.getfish; //调用Cat中特有的方法
3.异常
在进行向下转型的过程中,一不小心就出现java.lang.ClassCastException类型转换异常。(这个异常只在强制类型转换的时候出现,编译通过了,但是执行不通过)
为了避免这种类型转换异常的发生,Java提供了instanceof
关键字,给引用变量做类型的检验。
语法格式:
(引用 instanceof 数据类型)
运行结果是布尔类型
如果引用和数据类型相同,返回结果是true;
如果引用和数据类型不同,返回结果是false;
所以,我们在转换前,我们最好先进行引用变量的类型判断
Animals a1=new Cat();
if(a1 instanceof Cat){ //先判断a1指向的对象是Cat类型
Cat cc=(Cat)a1; //然后把a1强制转换成Cat类型
cc.getfish; //调用Cat中特有的方法
}