HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
  • 《PureJavaCoderRoad》

    • 导读

    • Java基础

      • Java入门

      • Java语法

      • Java流程控制

      • 面向对象

        • 1、方法
        • 2、静态字段和静态方法
        • 3、继承
        • 4、重载和重写
        • 5、多态
        • 6、抽象类
        • 7、接口
        • 8、值传递和引用传递
        • 9、枚举
        • Head-Java对象的理解
      • 异常处理

    • Java进阶

    • Java高阶

    • 开发辅助工具

    • 计算机网络

    • 数据库

    • JavaEE

    • 中间件

    • 架构

    • 建议

  • PureJavaCoderRoad
  • Java基础
  • 面向对象
#多态
码农阿雨
2022-05-26
目录

5、多态

多态在Java中是一个很重要的思想。

多态是指同一个行为表现出不同的形式。在Java中的理解就是调用一个方法,但是可以有不同的功能。

# 运行时多态存在的三个必要条件

  • 继承

    class WuLingHongGuang extends Car

  • 重写

    @Overide,方法覆盖

  • 父类引用指向子类对象

    Car wuLingHongGuangCar = new WuLingHongGuang();

eg:

以前我总是平平无奇地开车,并不知道开的是什么车,有一天哈C我一夜暴富,买了三辆车。

为了知道我在开什么车,我就写了三个类,抽取了共同的方法,只要我开车的时候,传入实例化的车辆就知道开什么车了:

public class Car {
    void drive() {
        System.out.println("平平无奇地开车");
    }
}

class WuLingHongGuang extends Car { //继承
    @Override
    void drive() {	//重写
        System.out.println("我在开五菱宏光");
    }
}

class BaoMa extends Car {
    @Override
    void drive() {
        System.out.println("我在开宝马");
    }
}

class AoDi extends Car {
    @Override
    void drive() {
        System.out.println("我在开奥迪");
    }
}

class Test {
    public static void main(String[] args) {
        Car car = new WuLingHongGuang(); //父类引用指向子类对象
        car.drive();

        Car car1 = new BaoMa();
        car1.drive();

        Car car2 = new AoDi();
        car2.drive();
    }
}

输出:

我在开五菱宏光
我在开宝马
我在开奥迪

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

小伙伴可能很容易就知道下面这个dirve()调用的是子类的方法:

Car car = new WuLingHongGuang();
car.drive(); 

但是Java是不知道的,它是在运行的时候才知道,又称为运行时多态

假如有一天,哈C我又买了很多辆车,车太多了,开不过来了,于是我雇了一个司机,让他帮我开车:

public class Car {
    void drive() {
        System.out.println("平平无奇地开车");
    }
}

class WuLingHongGuang extends Car {
    @Override
    void drive() {
        System.out.println("我在开五菱宏光");
    }
}

class BaoMa extends Car {
    @Override
    void drive() {
        System.out.println("我在开宝马");
    }
}

class AoDi extends Car {
    @Override
    void drive() {
        System.out.println("我在开奥迪");
    }
}

// class 其他车 extends Car {}

class Driver {
    void driveCar(Car car) {
        car.drive();		//司机开车
    }
}

class Test {
    public static void main(String[] args) {
        WuLingHongGuang wuLingHongGuang = new WuLingHongGuang();
        new Driver().driveCar(wuLingHongGuang); //帮我开五菱宏光
    }
}

这个时候,car.drive();司机在刚开始是不知道开什么车的,他只知道是一个Car,因为我们是无法知道传入的参数实际类型究竟是Car,还是Car的子类WuLingHongGuang、BaoMa、AoDi。

他可能是 开宝马、奥迪,也可能是简单地开车。

需要在传入的时候告诉司机开五菱宏光才知道:

WuLingHongGuang wuLingHongGuang = new WuLingHongGuang();
new Driver().driveCar(wuLingHongGuang); //帮我开五菱宏光

所以多态,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

简单的说,你需要执行什么方法(开什么车),车辆实例化 new 的时候去调用方法就好了。

还有就是我每次买了新车,只需要新增车辆的类,我是不需要修改原有的类,这就增强了代码的可扩展性。

阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#多态
上次更新: 2025-02-21 06:04:57
最近更新
01
《LeetCode 101》
02-21
02
IDEA、Golang、Pycharm破解安装
02-21
03
《LeetCode CookBook》
02-21
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式