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

2014-11-24 09:53:47 · 作者: · 浏览: 0

实现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.