Polymorphism

多态的向上转型

  1. 本质: 父类的引用指向了子类的对象
  2. 语法:父类类型 引用名 = new 子类类型 ():
  3. 特点: 编译类型看左边,运行类型看右边。 可以调用父类中的所有成员(需遵守访问权限), 不能调用子类中特有成员 最终运行效果看子类的具体实现!
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(); 调用不了
    }
}

多态向下转型

  1. 语法:子类类型 引用名=(子类类型)父类引用;
  2. 只能强转父类的引用,不能强转父类的对象
  3. 要求父类的引用必须指向的是当前目标类型的对象
  4. 当向下转型后,可以调用子类类型中所有的成员
Animal animal = new Cat();
// 向下转型
Cat cat = (Cat) animal; // cat 的编译类型 Cat,运行类型也是 Cat。进行了向下转型
cat.catchMouse();
 
// 要求父类的引用必须指向的是当前目标类型的对象
// Dog dog= (Dog) animal; 这样写就不行