这些Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改了解Java SE 9及其后续版本中的更新语言功能的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
多态的字典定义是指生物学中一种原则,即一个生物或物种可以有许多不同的形式或阶段。这个原则也可以应用于面向对象的编程和像Java语言这样的语言中。类的子类可以定义自己独特的行为,但仍然共享父类的某些功能。
可以通过对Bicycle
类进行微小修改来演示多态性。例如,可以向类中添加一个printDescription
方法,该方法显示当前实例中存储的所有数据。
public void printDescription(){ System.out.println("\n自行车在 " + "档位 " + this.gear + ",踏频为 " + this.cadence + ",以速度 " + this.speed + " 行驶。"); }
为了演示Java语言中的多态特性,可以使用MountainBike
和RoadBike
类来扩展Bicycle
类。对于MountainBike
,添加一个名为suspension
的字段,它是一个String
值,表示自行车是否具有前避震器(前避震器
)或前后避震器(双避震器
)。
以下是更新后的类:
public class MountainBike extends Bicycle { private String suspension; public MountainBike( int startCadence, int startSpeed, int startGear, String suspensionType){ super(startCadence, startSpeed, startGear); 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("山地自行车" + "具有" + getSuspension() + "避震系统。"); } }
请注意覆盖的printDescription
方法。除了之前提供的信息外,输出还包括有关避震系统的附加数据。
接下来,创建RoadBike
类。由于公路或赛车自行车使用细胎,因此添加一个属性来跟踪轮胎宽度。以下是RoadBike
类:
public class RoadBike extends Bicycle{ // 以毫米(mm)为单位 private int tireWidth; public RoadBike(int startCadence, int startSpeed, int startGear, int newTireWidth){ super(startCadence, startSpeed, startGear); 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("公路自行车" + "具有" + getTireWidth() + "毫米轮胎。"); } }
请注意,printDescription
方法再次被重写。这次,显示了有关轮胎宽度的信息。
总结一下,有三个类:Bicycle
、MountainBike
和RoadBike
。这两个子类重写了printDescription
方法并打印了独特的信息。
下面是一个测试程序,它创建了三个Bicycle
变量。每个变量都被分配给三个自行车类之一。然后打印每个变量。
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(); } }
以下是测试程序的输出:
自行车处于1档,踏频为20,速度为10。 自行车处于5档,踏频为20,速度为10。 山地自行车有双悬挂。 自行车处于8档,踏频为40,速度为20。 公路自行车有23毫米的轮胎。
Java虚拟机(JVM)调用与每个变量引用的对象相对应的方法。它不调用变量类型定义的方法。这种行为被称为虚拟方法调用,展示了Java语言中重要的多态性特征之一。