通过应用实例讨论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.     

9. 


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


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


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

10. // 用抽象方法作为多态接口 

11. public abstract class Employee { 

12.     ...  

13.     public abstract double earnings();    //定义抽象方法作为多态接口 

14.


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

15. //这个方法将作为多态接口被子类的方法所覆盖 

16.     public class Manager extends Employee { 

17.     ...  

18.     public double eamings () return 0.0


子类完善接口

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

19. public class Circle extends CircleShape2 { 

20.     ...  

21.     double volume = 0.0;                //Circle类没有体积 

22.     public void computeArea() {         //完善超类作为多态接口的抽象方法 

23.         area = Math.PI * radius * radius; 

24.     }  

25.     public double getArea() {  

26.         return area;  

27.     }  

28.     public void computeVolume() {}      //完善超类作为多态接口的抽象方法 

29.     public double getVolume() {  

30.         return volume;  

31.     }  

32.    

33.


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


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


34. public class Sphere extends Circle{  

35.     ...  

36.     public void computeArea() {     //覆盖Circle的该方法 

37.         super.computeArea();        //调用Circle的方法 

38.         area = 4* area;  

39.     }  

40.     public void computeVolume() {   //覆盖Circle的该方法 

41.         super.computeArea();        //调用Circle的方法 

42.         volume = 4.0/3 * radius * area;  

43.     }  

44.


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


45. //Demo code  

46. public Manager extends Employee { 

47.     ...  

48.     public double earnings () {   

49.         return baseSalary + meritPay + bonus; 

50.     }  


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


如何使用Java的多态


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


51. Circle myCircle = new Circle(20.98);  

52. Shape shape = myCircle;             //向上转型或超类引用 

53. shape.computeArea();.               //多态调用 

54. ... 


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

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


55. public class CircleShapeApp{ 

56.     public static void main(String[] args) {  

57.         Circle circle = new Circle(12.98);  

58.         Sphere sphere = new Sphere(25.55);  

59.    

60.         Shape shape = circle;       //向上转型 

61.         //多态调用 

62.         shape.computeArea(); 

63.         shape.computeVolume(); 

64.         System.out.println("circle area: " + shape.getArea());  

65.         System.out.println("circle volume: " + shape.getVolume());  

66.         //多态调用 

67.         shape = sphere; 

68.         shape.computeArea(); 

69.         shape.computeVolume(); 

70.         System.out.println("Sphere area: " + shape.getArea());  

71.         System.out.println("Sphere volume: " + shape.getVolume());  

72.     }  

73.


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

74. circle area: 529.2967869138698  

75. circle volume: 0.0  

76. Sphere area: 2050.8395382450512  

77. Sphere volume: 69865.26693621474 


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


78. ...  

79. for(int i = 0; i < objNum; i++) {           //循环objNum 

80.     shape[i].computeArea();                 //i0objNum-1  

81.     shape[i].computeVolume();  

82.     System.out.println("The area: " + shape[i].getArea()); 

83.     System.out.println("The volume: " + shape[i].getVolume());  

84.


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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值