多态
定义
一种事物的多种形态
调用
父类引用调用
成员变量:编译看父类
成员方法;编译看父类,运行看子类
注意:没有配合子类的重写,多态没有意义
多态的前提
重载
多态的最终表现形式
父类引用指向子类对象
引用数据类型的类型转换
1.子类转换为父类:自动转换
引用不能操作子类新增的成员变量和方法。
引用可以操作子类继承或重写的成员变量和方法
如果子类重写了父类的某个方法,引用调用该方法时,是调用的重写方法。
2.父类转换为子类:强制转换
为了调用子类独有的内容
//
父类引用指向子类对象
->
向上转型
Animal animal
=
new
Dog
();
animal
.
shout
();
//
调用父类中有的成员
//
向下转型
Dog dog
=
(
Dog
)
animal
;
//
编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通
不过编译器的检查。
dog
.
gnawBone
();
//
调用子类独有成员
注意
:
编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通不过编译器的检查。但是如果
两个没有关联的类进行强制转换,会报:
ClassCastException
。 比如:本来是狗,我把它转成猫。就
会报这个异常。
instanceof
使用前提
:
在向下转型的时候
,
为了避免类型转换异常
ClassCastException
的出现
,
可以使用
instanceof
进行判
断。
instanceof
是
Java
的一个二元操作符,和
==
,
>
,
<
是同一类。由于它是由字母组成的,所以也是
Java
的
保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回
boolean
类型的数据。
Animal animal
=
new
Dog
();
System
.
out
.
println
(
animal
instanceof
Animal
);
System
.
out
.
println
(
animal
instanceof
Cat
);
System
.
out
.
println
(
animal
instanceof
Dog
);
//
先判断后转型
if
(
animal
instanceof
Dog
){
Dog dog
=
(
Dog
)
animal
;
}