多态
向上转型和向下转型 (前提是两种类型之间具有继承关系)
- 向上转型:将子类对象赋给父类引用
- 向下转型:将父类引用转换为子类类型(使用场景:在需要访问子类中特有的方法的时候,如下面的catMouse()方法)
多态的解释
class test{
Animal a1 = new Cat();//向上转型
a1.move(); // 可以通过
a1.catchMouse();// 子类特有的方法,不能通过,编译阶段不通过。(a1到Animal中找catchMouse(),没找到,于是报错)。
}
class Animal{
public void move(){};
}
class cat extends Animal{
public void move(){};
public void catchMouse(){};
}
calss Bird extends Animal{
}
java程序执行分为编译阶段和运行阶段
-
编译阶段
编译器在编译检查语法的时候,发现a1为Animal类型,在调用move()方法的时候会到Animal.class文件中找move()方法,找到了,绑定上move(),编译通过,静态绑定成功。 -
运行阶段
在运行阶段的时候,实际在堆内存中创建的是Cat对象,于是到会到Cat中找move()方法并执行,这个过程属于动态绑定。
这就是多态的表现形式:编译时一种状态,运行时一种状态。
向下转型:(类似于强制类型转换)
Cat c = (Cat) a1;
c.catMouse();
将Animal类型的a1转换为Cat类型,此时c就能抓老鼠了。
向下转型的风险:
Animal a2 = new Bird();
Cat c2 = (Cat) a2;
/*
编译通过,运行报错
java.lang.ClassCastException 类型转换异常
*/