5.2.3、多态性

这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
5.2.3、多态性

在生物学中对多态的定义是:任何一个物种或群体都会有多种形式和阶段。这个原理也可以运用到面向对象编程语言中,比如Java。子类定义它特有的行为同时共享父类的公共能力。

通过对 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 + ". ");
}

为演示Java的多态特性,用MountainBikeRoadBike 扩展类 BicycleMountainBike 增加一个字段 suspension,该字段为String类型的值,用来描述自行车拥有前减震器,Front;或者描述自行车拥有后减震器,Dual

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("The " + "MountainBike has a" +
            getSuspension() + " suspension.");
    }
} 

注意 printDescription 方法。除了Bicycle类提供的信息,还追加了suspension信息。

接下来,创建RoadBike 。由于公路比赛用自行车都有比较宅的轮胎,增加一个字段用来描述轮胎的宽度。

public class RoadBike extends Bicycle{
    // In millimeters (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("The RoadBike" + " has " + getTireWidth() +
            " MM tires.");
    }
}

请注意 printDescription 方法被重写了。这一次则是追加了轮胎宽度信息。

现在总结下,我们有3个类:BicycleMountainBikeRoadBike。两个子类都重写了父类的printDescription方法并打印了它们特有的信息。

下面我们创建3个Bicycle类型的变量。将3个bicycle对象赋值给这3个变量,然后打印每个变量。

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虚拟机会调用每个变量引用对象的合适方法。它不会调用变量声明类型的方法。该行为称为 虚拟方法引用 ,很好的演示了Java语言中最重要的特性之一多态性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值