多态解决了之前的疑问:左边是对象类型,右边是对象的构造器(执行的方法都在构造器里面)
Animal a = new Dog(); // 这是一个多态类型,左边是对象的类型,右边是该对象的构造器
传入的参数,为Animal类型,但是是Dog的构造器,所以执行的是Dog类的方法
运行流程:
image.png

多态下,不能访问子类独有功能(父类没有的):因为编译看左边(父类没有该方法,所以没有对该方法进行编译),只能访问重写的功能

image.png
image.png

  1. package com.itheima.d2_polymorphic_advantage;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Animal a = new Tortoise();
  5. go(a); // 传入的参数,为Animal类型,但是是Tortoise的构造器
  6. Animal a2 = new Dog();
  7. go(a2); // 由于是Dog的构造器,所以执行的是Dog方法
  8. // a2.lookDoor(); 多态下,不能访问子类独有功能(父类没有的)
  9. }
  10. /**
  11. * 要求:所有的动物都可以进来比赛
  12. */
  13. public static void go(Animal a) { // 如果写Dog类,只有Dog类的对象能进来,如果是Animal就是所有的动物都能进来
  14. System.out.println("开始.....");
  15. a.run(); // 运行该对象的方法(看右边)
  16. System.out.println("结束。。。。");
  17. }
  18. }
  1. // 这是一个抽象父类
  2. package com.itheima.d1_polymorphic;
  3. public abstract class Animal {
  4. public String name = "父类动物";
  5. public abstract void run();// 就定义方法,让子类继承
  6. }
  7. // 这是一个子类
  8. package com.itheima.d1_polymorphic;
  9. public class Dog extends Animal{
  10. public String name = "子类狗";
  11. @Override
  12. public void run() {
  13. System.out.println("🐕跑的贼快~~");
  14. }
  15. }
  16. // 这是一个子类
  17. package com.itheima.d1_polymorphic;
  18. public class Tortoise extends Animal{
  19. public String name = "子类龟";
  20. @Override
  21. public void run() {
  22. System.out.println("🐢根本跑不了");
  23. }
  24. }