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
的时候去调用方法就好了。
还有就是我每次买了新车,只需要新增车辆的类,我是不需要修改原有的类,这就增强了代码的可扩展性。
上次更新: 2025-02-21 06:04:57