通过应用实例讨论Java多态的实现

开发 后端
本文探讨了Java多态的实现。首先归纳了在代码中实现Java的多态必须遵循的要求,然后通过实例讲解了实现Java多态的几种方法。

实现Java多态

在代码中实现Java的多态必须遵循的要求可归纳如下:

1.代码中必须有超类和子类继承关系。

2.超类提供作为接口的方法,对子类完善或者覆盖这些方法指定规范。

3.参与多态的子类必须完善或者覆盖这些指定的方法,以达到接口效应。

4.编写驱动类,或者应用代码,子类向上转型为超类引用,实现多态。

下面小节应用实例分别讨论如何实现多态。

超类提供Java多态接口

以计算圆形物体表面积和体积为例,讨论多态对超类的要求以及如何提供多态接口:

  1. public abstract class Shape {  
  2.     ...  
  3.     // 以下定义抽象方法作为多态接口  
  4.     public abstract void computeArea();       
  5.     public abstract void computeVolume();         
  6.     public abstract double getArea();           //新增参与多态的接口方法  
  7.     public abstract double getVolume();   
  8.    

除原来存在的两个抽象方法外,因为getArea()和getVolume()也涉及和参与多态功能,因此将它们定义为实现多态的接口方法。另外多态的实现不影响任何其他运算和操作,所以这个代码的其他部分无需修改。

当然执行多态的超类不必一定是抽象类。但因为在这个超类中,甚至大多数应用程序的超类中,只提供执行具体运算的方法的签名,不可能提供具体代码。所以应用抽象方法作为多态接口比较普遍。

如在计算公司雇员工资的超类中:

  1. // 用抽象方法作为多态接口  
  2. public abstract class Employee {  
  3.     ...  
  4.     public abstract double earnings();    //定义抽象方法作为多态接口  

也可定义为普通方法,如:

  1. //这个方法将作为多态接口被子类的方法所覆盖  
  2.     public class Manager extends Employee {  
  3.     ...  
  4.     public double eamings () return 0.0

子类完善接口

在计算圆形物体表面积和体积的例子中,CircleShape2继承了Shape,Circle继承了CircleShape2。Circle类中完善了抽象超类指定的、作为多态接口的抽象方法如下:

  1. public class Circle extends CircleShape2 {  
  2.     ...  
  3.     double volume = 0.0;                //Circle类没有体积  
  4.     public void computeArea() {         //完善超类作为多态接口的抽象方法  
  5.         area = Math.PI * radius * radius;  
  6.     }  
  7.     public double getArea() {  
  8.         return area;  
  9.     }  
  10.     public void computeVolume() {}      //完善超类作为多态接口的抽象方法  
  11.     public double getVolume() {  
  12.         return volume;  
  13.     }  
  14.    

代码中完善了超类Shape规定的四个作为多态接口的抽象方法,实际上,已存在的Circle程序已经编写了其中的两个方法,只需要完善computeVolume()和getVolume()即可。Circle类没有体积计算,所以ComputeVolume()为空程序体且getVolume()返回值为0.0。

以此类推,Sphere继承了Circle,覆盖了Circle的computeArea()和computeVolume():

  1. public class Sphere extends Circle{  
  2.     ...  
  3.     public void computeArea() {     //覆盖Circle的该方法  
  4.         super.computeArea();        //调用Circle的方法  
  5.         area = 4* area;  
  6.     }  
  7.     public void computeVolume() {   //覆盖Circle的该方法  
  8.         super.computeArea();        //调用Circle的方法  
  9.         volume = 4.0/3 * radius * area;  
  10.     }  

并且继承了getArea()和getVolume()。显而易见,抽象类和覆盖技术的应用,已经为实现多态铺平了道路。这里,只是对抽象类中指定的抽象方法,以及子类完善这些方法,从多态接口的角度加以新的内容和解释。按照这个概念代码技术,编写计算员工工资的子类也是水到渠成的事。如:

  1. //Demo code  
  2. public Manager extends Employee {  
  3.     ...  
  4.     public double earnings () {   
  5.         return baseSalary + meritPay + bonus;  
  6.     }  

值得一提的是,如果超类中定义的作为多态接口的方法是一个完善了的普通方法,在子类中则需覆盖它,以便实现多态。

如何使用Java的多态

调用多态方法是通过向上转型,或称超类引用实现的。即向上转型后,由超类产生对子类多态方法的动态调用,如:

  1. Circle myCircle = new Circle(20.98);  
  2. Shape shape = myCircle;             //向上转型或超类引用  
  3. shape.computeArea();.               //多态调用  
  4. ... 

应用链接表或集合,以及循环,则可有效地对大量的对象方法实行多态调用。本书将在以后的章节专门讨论循环、链接表和集合技术。

如下是对计算圆形物体的表面积和体积实现多态调用的代码:

  1. public class CircleShapeApp{  
  2.     public static void main(String[] args) {  
  3.         Circle circle = new Circle(12.98);  
  4.         Sphere sphere = new Sphere(25.55);  
  5.    
  6.         Shape shape = circle;       //向上转型  
  7.         //多态调用  
  8.         shape.computeArea();  
  9.         shape.computeVolume();  
  10.         System.out.println("circle area: " + shape.getArea());  
  11.         System.out.println("circle volume: " + shape.getVolume());  
  12.         //多态调用  
  13.         shape = sphere;  
  14.         shape.computeArea();  
  15.         shape.computeVolume();  
  16.         System.out.println("Sphere area: " + shape.getArea());  
  17.         System.out.println("Sphere volume: " + shape.getVolume());  
  18.     }  

这里对Circle对象多态调用computeVolume()毫无意义,仅是为了演示目的。其运行结果为:

  1. circle area: 529.2967869138698  
  2. circle volume: 0.0  
  3. Sphere area: 2050.8395382450512  
  4. Sphere volume: 69865.26693621474 

如果需要多态调用大量对象,可以使用数组和循环如下:

  1. ...  
  2. for(int i = 0; i < objNum; i++) {           //循环objNum次  
  3.     shape[i].computeArea();                 //i从0到objNum-1  
  4.     shape[i].computeVolume();  
  5.     System.out.println("The area: " + shape[i].getArea());  
  6.     System.out.println("The volume: " + shape[i].getVolume());  

这个循环语句也被称为多态管理循环。

Java的多态就先介绍到这里。本文出自 “海外咖啡豆 - 高永强的博客天地” 博客。

【编辑推荐】

  1. 浅谈.NET中不一样的多态
  2. OO世界中的核心概念 .NET中的多态
  3. 深入理解Java多态性
  4. 初学Java语言之多态初体验
  5. 对Java程序多态性支持的改进
责任编辑:yangsai 来源: 海外咖啡豆
相关推荐

2010-11-22 16:01:08

C++多态

2009-09-01 18:29:10

C#继承C#多态

2010-01-28 16:16:32

C++多态性

2010-09-14 09:30:04

Java多态

2010-01-15 10:56:50

VB.NET继承实现多

2023-11-20 08:02:49

2023-09-05 07:28:02

Java自动埋点

2024-01-29 08:26:13

Span高性能数组数据结构

2009-08-19 09:51:31

Java入门

2021-04-15 09:07:52

hotspotJavaC++

2011-03-08 09:40:26

Java多态性

2009-12-22 15:05:07

Linux应用软件

2012-05-28 09:10:18

云计算应用

2023-10-31 07:37:02

2015-02-05 09:42:00

移动开发虚拟讨论

2009-07-10 15:10:02

Java Swing经

2009-10-16 18:31:11

六类布线系统

2011-03-02 09:10:14

六类布线

2023-11-16 09:10:18

多态封装继承

2011-04-12 10:40:04

C++多态
点赞
收藏

51CTO技术栈公众号