一、多态

概述

面向对象语言三大特征:封装(private)、继承(extends)、多态。 多态:表示的是一个事物的多种表现形态。同一个事物,以不同的形态表现出来.**

:::info

使用多态的前提

  1. 继承(extends)或者实现(implements)【二选一】
  2. 方法的重写【意义体现:不重写,无意义】
  3. 父类引用指向子类对象【格式体现】 :::

    多态的体现

    1. 父类类型 变量名 = new 子类对象; 变量名.方法名();|
    小结:多态的好处是提高程序的灵活性,扩展性

    引用类型转换

    多态的转型分为向上转型与向下转型两种:

    • 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。

    当父类引用指向一个子类对象时,便是向上转型。

  1. 父类类型 变量名 = new 子类类型();
  2. 如:Animal a = new Cat();
  • 向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。

一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。

  1. 子类类型 变量名 = (子类类型) 父类变量名;
  2. 如:Cat c =(Cat) a;
  1. abstract class Animal {
  2. abstract void eat();
  3. }
  4. class Cat extends Animal {
  5. public void eat() {
  6. System.out.println("吃鱼");
  7. }
  8. public void catchMouse() {
  9. System.out.println("抓老鼠");
  10. }
  11. }
  12. class Dog extends Animal {
  13. public void eat() {
  14. System.out.println("吃骨头");
  15. }
  16. public void watchHouse() {
  17. System.out.println("看家");
  18. }
  19. }
  20. 测试类
  21. public class Test {
  22. public static void main(String[] args) {
  23. // 向上转型
  24. Animal a = new Cat();
  25. a.eat(); // 调用的是 Cat 的 eat
  26. // 向下转型
  27. Cat c = (Cat)a;
  28. c.catchMouse(); // 调用的是 Cat 的 catchMouse
  29. }
  30. }

转型的异常:ClassCastException类型转换异常

避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 向上转型
  4. Animal a = new Cat();
  5. a.eat(); // 调用的是 Cat 的 eat
  6. // 向下转型
  7. if (a instanceof Cat){
  8. Cat c = (Cat)a;
  9. c.catchMouse(); // 调用的是 Cat 的 catchMouse
  10. } else if (a instanceof Dog){
  11. Dog d = (Dog)a;
  12. d.watchHouse(); // 调用的是 Dog 的 watchHouse
  13. }
  14. }
  15. }