多态的向上转型
- 本质: 父类的引用指向了子类的对象
- 语法:
父类类型 引用名 = new 子类类型 (): - 特点: 编译类型看左边,运行类型看右边。 可以调用父类中的所有成员(需遵守访问权限), 不能调用子类中特有成员 最终运行效果看子类的具体实现!
public class Animal {
public void cry() {
System.out.println("Animal cry() 动物在叫....");
}
}
public class Cat extends Animal {
public void cry() {
System.out.println("Cat cry() 小猫喵喵叫...");
}
public void catchMouse() {
System.out.println("catchMouse");
}
}
public class Dog extends Animal {
public void cry() {
System.out.println("Dog cry() 小狗汪汪叫...");
}
}
public class PolyObject {
public static void main(String[] args) {
Animal animal = new Dog();
// 因为运行时,执行到改行时,animal运行类型是Dog,所以cry就是Dog的cry
animal.cry(); // 小狗汪汪叫
// animal 编译类型 Animal,运行类型就是 Cat
animal = new Cat();
animal.cry(); // 小猫喵喵叫
// 可以调用父类中的所有成员(需遵守访问权限), **不能调用子类中特有成员**
// animal.catchMouse(); 调用不了
}
}多态向下转型
- 语法:子类类型 引用名=(子类类型)父类引用;
- 只能强转父类的引用,不能强转父类的对象
- 要求父类的引用必须指向的是当前目标类型的对象
- 当向下转型后,可以调用子类类型中所有的成员
Animal animal = new Cat();
// 向下转型
Cat cat = (Cat) animal; // cat 的编译类型 Cat,运行类型也是 Cat。进行了向下转型
cat.catchMouse();
// 要求父类的引用必须指向的是当前目标类型的对象
// Dog dog= (Dog) animal; 这样写就不行