多态

多态概述

多态概述:同一个对象,在不同时刻表现出来的不同形态

例:猫

我们可以说猫是猫:猫 cat = new 猫();

我们也可以说猫是动物:动物 animal = new 猫();

这里猫在不同的时刻表现出来了不同的形态,这就是多态

多态的前提和体现

  • 有继承/实现关系
  • 有方法重写
  • 有父类引用指向子类对象(父类引用指的是动物 animal,子类对象指的是new 猫())

例:

Animal.java

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat.java

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃东西");
    }
}

AnimalDemo.java

public class AnimalDemo {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Animal a = new Cat();
    }
}

多态中成员的访问特点

  • 成员变量:编译看左边,执行看左边(即左边有的变量才能编译成功,执行的结果也是左边的结果)
  • 成员方法:编译看左边,执行看右边(即左边有的方法才能编译成功,但执行的结果是右边的结果)

为什么成员变量和成员方法的访问不一样呢?

  • 因为成员方法有重写,而成员变量没有

多态的好处和弊端

  • 多态的好处:提高了程序的拓展性

    ​ 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

  • 多态的弊端:不能使用子类的特有功能

多态中的转型

  • 向上转型

    ​ 从子到父

    ​ 父类引用指向子类对象

  • 向下转型

    ​ 从父到子

    ​ 父类引用转为子类对象

Animal.java

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat.java

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃东西");
    }
    
    public void playGame() {
        System.out.println("猫捉迷藏");
    }
}

AnimalDemo.java

public class AnimalDemo {
    public static void main(String[] args) {
        //多态
        Animal a = new Cat();	//向上转型
        a.eat();	//输出:猫吃鱼
        //a.playGame();	//编译不通过:不能访问子类特有的方法
        
        //向下转型
        Cat c = (Cat) a;
        c.eat();
        c.playGame;	//编译通过
    }
}

结论:通过向下转型解决了多态的弊端——不能访问子类的特有功能

注:没有任何关系的两个类不能强制类型转换,否则会报错:ClassCastException 类型转换异常

posted @ 2022-01-29 16:56  我的奇妙之旅  阅读(29)  评论(0)    收藏  举报