文档

Java™教程
隐藏目录
多态性
路径:学习Java语言
课程:接口和继承
章节:继承

多态性

多态的字典定义是指生物学中一种原则,即一个生物或物种可以有许多不同的形式或阶段。这个原则也可以应用于面向对象的编程和像Java语言这样的语言中。类的子类可以定义自己独特的行为,但仍然共享父类的某些功能。

可以通过对Bicycle类进行微小修改来演示多态性。例如,可以向类中添加一个printDescription方法,该方法显示当前实例中存储的所有数据。

public void printDescription(){
    System.out.println("\n自行车在 " + "档位 " + this.gear
        + ",踏频为 " + this.cadence +
        ",以速度 " + this.speed + " 行驶。");
}

为了演示Java语言中的多态特性,可以使用MountainBikeRoadBike类来扩展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方法再次被重写。这次,显示了有关轮胎宽度的信息。

总结一下,有三个类:BicycleMountainBikeRoadBike。这两个子类重写了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语言中重要的多态性特征之一。


上一页: 覆盖和隐藏方法
下一页: 隐藏字段