这是我的学习笔记,老师讲了没多久,大家一起学习,请补充.
面向对象的多态
多太就是事物
(
对象
)
的多种表现形态
父类指向子对象
多态的好处:让程序的扩展性变的更强
,
不用在面对具体的子类对象
多态的弊端:只能访问父类的功能
,
无法使用子类特有的功能
.
例 :
Class animal
{
Abstract void eat();
Abstract void sleep();
}
Class cat()
{
......
}
Class dog()
{
......
}
Class test
{
Public static void main(String[] args)
{
Dog d = new dog();
Method(d);
}
Public static void Method (animal a)
{
A.ect();
A.sleep();
}
}
多态中的类型转换
1.多态中的自动类型提升
Dog d = new dog();
Animal a = new dog();
引用的类型是Animal的类型,而引用所指的类型Animal的子类类型。
这时就发生了类型的自动提升。把Animal子类类型提升成了Animal类型。
这时就发生了类型的自动提升。把Animal子类类型提升成了Animal类型。
这种类型的提升会导致无法使用子类特有的方法
,
如果想要使用子类的特有方法
,
必须将
animal
类型再转成对应的子类型
,
才能去使用
.
2.类型向下转型
(
强制类型转换
)
Animal a =new dog();
Dog d = (dog)a;
把
animal
类型强转成子类型
.
当我们把一个子类型强制转换成其他类型
(
这个类型不是子类的父类
)
时
,
会发生
ClassCastException
异常
.
ClassCastException
叫作类型转换异常
.
如何避免这个异常呢
?
在进行向下转型时
,
应该先做类型判断
,
当符合强转要求时
,
我们才进行强转
,
否则就不进行转换
.
健壮性判断用到
if
关健字
,
判断类型是否可转
public static void method(Animal a)
{
a.eat();
//a.lookHome();编译报错,原因是这里a是Animal类型,只能使用Animal中描述的功能,而无法使用子类特有的功能
if( a instanceof Dog )
{
Dog d = (Dog)a;
d.lookHome();
}
a.sleep();
}