含义
- 多态是继封装、继承之后,面向对象的第三大特性。
- 多态体现为父类引用变量可以指向子类对象。
- 前提条件:存在子父类关系。
- 在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态的使用格式:
定义格式:父类类型 变量名=new 子类类型();
字典对多态一词是这样解释的:一种生物学中的概念,指某种有机体或物种在生长过程中可能有多种不同的形态或阶段。
这一概念也适用于面向对象编程和Java这样的编程语言中,即一个类的各个子类可以在定义自己独有的行为的同时共享其父类的某些功能。
多态的转型
-
向上转型
父类引用指向子类对象使用格式:父类类型 变量名=new 子类类型();
适用场景:子类不需要提供扩展功能,直接使用父类的功能就能完成相应的操作。 向下转型:
将向上转型的子类对象强制类型转换成具体子类对象
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
特点
- 多态成员变量:编译运行看左边
Fu f=new Zi();
//f是父类Fu中的值
System.out.println(f.num);
- 多态成员方法:编译看左边,运行看右边
Fu f1=new Zi();
//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
System.out.println(f1.show());
演示
准备:
定义一个Bicycle类,类中定义一个printDescription()方法,及多个实例变量,该方法可以输出实例中当前存储的数据。
public void printDescription(){
System.out.println("\nBike is " + "in gear " + this.gear
+ " with a cadence of " + this.cadence +
" and travelling at a speed of " + this.speed + ". ");
}
为了演示多态的特点,为Bicycle创建两个子类:MountainBike和RoadBike。为MountainBike类添加一个String suspension实例变量,表明该自行车有一个前减震器。
修改后的MountainBike类如下:
public class MountainBike extends Bicycle {
private String suspension;
public MountainBike(..., String suspensionType){
...
this.setSuspension(suspensionType);
}
public String getSuspension(){
return this.suspension;
}
public void setSuspension(String suspensionType){
this.suspension = suspensionType;
}
public void printDescription() {
super.printDescription();
System.out.println("The " + "MountainBike has a" +
getSuspension() + " suspension.");
}
}
该类重写了printDescription方法。该方法除了输出从父类中继承的数据信息之外,还会输出与悬架(susoension)有关的信息。
接下来在RoadBike中添加一个int tireWidth 实例变量,以记录轮胎宽度。修改后的RoadBike如下:
public class RoadBike extends Bicycle{
// In millimeters (mm)
private int tireWidth;
public RoadBike(..., int newTireWidth){
...
this.setTireWidth(newTireWidth);
}
public int getTireWidth(){
return this.tireWidth;
}
public void setTireWidth(int newTireWidth){
this.tireWidth = newTireWidth;
}
public void printDescription(){
super.printDescription();
System.out.println("The RoadBike" + " has " + getTireWidth() +
" MM tires.");
}
}
同样,该类重写了printDescription方法。该方法除了输出从父类中继承的数据信息之外,还会输出与轮胎宽度有关的信息。
总结一下:总共有3个类,Bicycle,MountainBike,和RoadBike。第一个类是后两个类的父类。为输出各自独有的信息,两个子类分别重写了父类法printDescription()方法。
运行:
下面是一个用类测试3个Bicycle类的测试类。该类创建了3个Bicycle类型的变量,每个变量指向了上面说明的3个类的实例。接着测试类调用了每个实例的printDescription()方法。
public class TestBikes {
public static void main(String[] args){
Bicycle bike01, bike02, bike03;
bike01 = new Bicycle(20, 10, 1);
bike02 = new MountainBike(20, 10, 5, "Dual");
bike03 = new RoadBike(40, 20, 8, 23);
bike01.printDescription();
bike02.printDescription();
bike03.printDescription();
}
}
程序的输出如下:
Bike is in gear 1 with a cadence of 20 and travelling at a speed of 10.
Bike is in gear 5 with a cadence of 20 and travelling at a speed of 10.
The MountainBike has a Dual suspension.
Bike is in gear 8 with a cadence of 40 and travelling at a speed of 20.
The RoadBike has 23 MM tires.
Java虚拟机会调用每个变量指向的具体对象的具体printDescription方法,而不会调用变量类型定义的方法。这一行为被称为虚拟方法调用,属于Java语言中十分重要的多态特性的一部分。
==> 部分资料引自甲骨文
*欢迎到作者github主页交流