Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

细节23 变化莫测——多态

多态是一种机制,当父类的某个方法被多个子类重写后,将不同的子类对象赋值给父类对象的引用,可以产生不同的功能,这就是多态。实际上,多态也表现为将实现接口的类创建的对象赋值给接口的引用,以完成不同实现类的功能,这个多态的主要特性可以方便程序开发和代码维护。

父类Polygon的代码示例:

    public class Polygon {
      public void showArea (){                              // 父类用于显示面积的方法
      }
    }

子类Rectangle的代码示例:

    public class Rectangle extends Polygon {
      private float width;                                 // 定义矩形的宽度
      private float height;                                // 定义矩形的高度
      public Rectangle (float width , float height){        // 初始化宽度和高度
          this. width = width;
          this. height = height;
      }
      public void showArea () {                             // 重写父类中显示面积的方法
          float area = width * height;                     // 计算矩形的面积
          System. out. println ("矩形的面积是:" + area);
      }
    }

子类Triangle的代码示例:

    public class Triangle extends Polygon {
      private float sideWidth;                             // 定义三角形底边的长度
      private float height;                                // 定义三角形的高
      public Triangle (float sideWidth , float height){     // 初始化三角形底边的长度和高度
          this. sideWidth = sideWidth;
          this. height = height;
      }
      public void showArea () {                             // 重写父类中显示面积的方法
          float area = (sideWidth * height) / 2.0f;        // 计算三角形的面积
          System. out. println ("矩形的面积是:" + area);
      }
    }

测试类的多态性示例:

    public class Test {
      public static void main (String[] args) {
          ❶Polygon polygon = new Rectangle (20,40);    // 使用子类Rectangle创建父类的实例
          ❷polygon. showArea ();                        // 调用显示面积的方法
          ❸polygon = new Triangle (20,40);             // 使用子类Rectangle创建父类的实例
          ❹polygon. showArea ();                        // 调用显示面积的方法
      }
    }

运行本示例,程序将输出如图5.19所示的信息。

图5.19 多态的输出结果

说明

由于在标记❶处将子类Rectangle创建的对象赋值给了父类的引用,所以在标记❷处调用的showArea ()方法是子类Rectangle中的方法,因此输出了如图5.19所示的第一行信息;在标记❸处将子类Triangle 创建的对象赋值给了父类的引用,所以在标记❹处调用的showArea ()方法是子类Triangle中的方法,因此输出了如图5.19所示的第二行信息。