对象的多态(核心、重点)

  • 一个对象的编译类型和运行类型可以不一致

    Animal animal= new Dog(); 编译类型是Animal,运行类型是Dog

  • 编译类型在定义对象时就确定了,不能改变。

  • 运行类型是可以改变的。

    animal = new Cat(); animal的运行类型变成了Cat,编译类型还是Animal

  • 编译类型看定义时=号的左边,运行类型看=号的右边。

案例

image.png

Animal

  1. package test01;
  2. public class Animal {
  3. public void cry() {
  4. System.out.println("Animal cry() 动物在叫....");
  5. }
  6. }

Cat

  1. package test01;
  2. public class Cat extends Animal {
  3. @Override
  4. public void cry() {
  5. System.out.println("Cat cry() 小猫喵喵叫...");
  6. }
  7. }

Dog

  1. package test01;
  2. public class Dog extends Animal {
  3. @Override
  4. public void cry() {
  5. System.out.println("Dog cry() 小狗汪汪叫...");
  6. }
  7. }

Object

  1. package test01;
  2. public class Object {
  3. public static void main(String[] args) {
  4. //体验对象多态的特点
  5. //animal 编译类型就是 Animal , 运行类型 Dog
  6. Animal animal = new Dog();
  7. //因为运行时 , 执行到改行时,animal运行类型是Dog,所以cry就是Dog的cry
  8. animal.cry(); //小狗汪汪叫
  9. //animal 编译类型 Animal,运行类型就是 Cat
  10. animal = new Cat();
  11. animal.cry(); //小猫喵喵叫
  12. }
  13. }

image.png