多态的基础语法
向上,向下转型
这里先说两个概念:
- 向上转型:是指从子类到父类
- 向下转型:是从父类转到子类
JAVA 中允许向上转型和向下转型。但是他们之间必须是有继承的关系
向上转型
Animal a = new Cat();
向下转型
如果想访问的方法,在父类中没有,是子类中特有的,就必须使用向下转型了(强制类型转换)
比如下例中,cat 中的抓老鼠方法是特有的
public class demo1 {
public static void main(String[] args) {
Animal c = new Cat();
Cat d = (Cat)c;//这里使用向下转型
d.catchMouse();
}
}
class Cat extends Animal{
@Override
public void move() {
System.out.println("cat is talking!");
}
public void catchMouse(){
System.out.println("catching mouse");
}
}
但,向下转型是有风险的。经常会出现转换类型的错误。
例如:(编译可以通过但是并不能运行)
java.lang.ClassCastException类型转换的错误
public class demo1 {
public static void main(String[] args) {
Animal c = new Bird();
Cat d = (Cat)c;//这里,会出现一个经典错误
d.catchMouse();
}
}
class Animal{
public void move(){
System.out.println("animal is running!");
}
}
class Bird extends Animal{
@Override
public void move() {
System.out.println("bird is flying!");
}
}
class Cat extends Animal{
@Override
public void move() {
System.out.println("cat is talking!");
}
public void catchMouse(){
System.out.println("catching mouse");
}
}
因为 c 里面其实是鸟,但是他强制转换为了猫。可是猫和鸟之间是没有继承关系的。只有动物和它们之间存在,于是不能出现向下转型
instanceof 运算符
避免问题的方法,就是使用 instanceof 的运算符
-
instanceof 它可以在运行阶段动态判断引用指向的对象的类型
-
instanceof 的语法(引用 instanceof 类型)
-
instanceof 的运算结果只能是 true/false
-
c 是一个引用,c 变量保存了内存地址指向了堆中的对象。
假设(c instanceof Cat)为 true 表示:c 的内存地址指向的是一个 Cat 类型。假设(c instanceof Cat)为 false 表示:不是一个 Cat 类型的。
public class demo1 {
public static void main(String[] args) {
Animal c = new Bird();
if (c instanceof Cat) {//那么就这样做一个判断
Cat d = (Cat)c;
d.catchMouse();
}else {
System.out.println("转换失败");
}
}
}