一、多态

概述

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

:::info

使用多态的前提

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

    多态的体现

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

    引用类型转换

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

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

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

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

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

子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
abstract class Animal {  
    abstract void eat();  
}  

class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void catchMouse() {  
        System.out.println("抓老鼠");  
    }  
}  

class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void watchHouse() {  
        System.out.println("看家");  
    }  
}
测试类
public class Test {
    public static void main(String[] args) {
        // 向上转型  
        Animal a = new Cat();  
        a.eat();                 // 调用的是 Cat 的 eat

        // 向下转型  
        Cat c = (Cat)a;       
        c.catchMouse();         // 调用的是 Cat 的 catchMouse
    }  
}

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

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

public class Test {
    public static void main(String[] args) {
        // 向上转型  
        Animal a = new Cat();  
        a.eat();               // 调用的是 Cat 的 eat

        // 向下转型  
        if (a instanceof Cat){
            Cat c = (Cat)a;       
            c.catchMouse();        // 调用的是 Cat 的 catchMouse
        } else if (a instanceof Dog){
            Dog d = (Dog)a;       
            d.watchHouse();       // 调用的是 Dog 的 watchHouse
        }
    }  
}