Java 多态

多态存在的三个必要条件

继承

重写

父类引用指向子类的对象

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

实例:

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

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

class Dog extends Animal{ //子类
    public void eat() {
        System.out.println("狗狗要吃骨头~~~");
    }
    public void work() {
        System.out.println("狗狗要看家!!!");
    }
    
}

class Cat extends Animal{ //子类
    public void eat() {
        System.out.println("猫咪要吃小鱼~~~");
    }
    public void worrk() {
        System.out.println("猫咪要抓老鼠!!!");
    }
}

运行结果:

猫咪要吃小鱼~~~
猫咪要抓老鼠!!!

我们主要来分析下面这一段代码:

Animal a = new Cat(); //向上转型

Animal 是引用类型,声明了 a 这个对象可以做哪些事,但是在对象生成的过程中,用的是 Cat 类的构造器,所以Animal相当于一个空头支票,对象 a 实际上能做的事是 Cat 决定的。此时的 a 可以调用 Cat 类或者以 Cat 类为父类的子类里面的成员变量和成员方法,而不能调用 Animal 类里面的成员变量和成员方法。

为什么叫向上转型呢?因为 a 是属于 Cat 里面的对象,而它的引用类型是 Animal,显然,Animal是 Cat 的父类,高于 Cat,所以类型就相当于向上转型了。

Cat c = (Cat)a; //向下转型

这行代码中,Cat 是引用类型,创建了一个对象 c ,并且给 c 赋值为 a。因为一开始 a 是 Animal 类型的,所以要做一次强制类型转换才能和前面的 c 配得上。这就叫做向下转型。

但是,做强制类型转化是有条件的,对象的能实际使用的哪个类型(a 实际使用的类型是Cat)不能低于将要转化的类型。

举个例子,如下图:

向上类型转换就向是茶杯往茶壶里倒水,即便全部倒进去也不用担心溢出。

但是向下类型转换就有风险了,一不小心就有可能把水倒的溢出。

多态的实现方式

方式一:重写:

https://www.cnblogs.com/chuijingjing/p/9461729.html

方式二:接口

https://www.cnblogs.com/chuijingjing/p/9472472.html

方式三:抽象类和抽象方法

 https://www.cnblogs.com/chuijingjing/p/9476943.html

原文地址:https://www.cnblogs.com/chuijingjing/p/9461787.html