`
444878909
  • 浏览: 639073 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

实现Java多态

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

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

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

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

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


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


超类提供Java多态接口


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


1. publicabstractclassShape{

2. ...

3. //以下定义抽象方法作为多态接口

4. publicabstractvoidcomputeArea();

5. publicabstractvoidcomputeVolume();

6. publicabstractdoublegetArea();//新增参与多态的接口方法

7. publicabstractdoublegetVolume();

8.

9. }


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


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


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

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

11. publicabstractclassEmployee{

12. ...

13. publicabstractdoubleearnings();//定义抽象方法作为多态接口

14. }


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

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

16. publicclassManagerextendsEmployee{

17. ...

18. publicdoubleeamings()return0.0;


子类完善接口

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

19. publicclassCircleextendsCircleShape2{

20. ...

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

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

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

24. }

25. publicdoublegetArea(){

26. returnarea;

27. }

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

29. publicdoublegetVolume(){

30. returnvolume;

31. }

32.

33. }


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


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


34. publicclassSphereextendsCircle{

35. ...

36. publicvoidcomputeArea(){//覆盖Circle的该方法

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

38. area=4*area;

39. }

40. publicvoidcomputeVolume(){//覆盖Circle的该方法

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

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

43. }

44. }


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


45. //Democode

46. publicManagerextendsEmployee{

47. ...

48. publicdoubleearnings(){

49. returnbaseSalary+meritPay+bonus;

50. }


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


如何使用Java的多态


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


51. CirclemyCircle=newCircle(20.98);

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

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

54. ...


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

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


55. publicclassCircleShapeApp{

56. publicstaticvoidmain(String[]args){

57. Circlecircle=newCircle(12.98);

58. Spheresphere=newSphere(25.55);

59.

60. Shapeshape=circle;//向上转型

61. //多态调用

62. shape.computeArea();

63. shape.computeVolume();

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

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

66. //多态调用

67. shape=sphere;

68. shape.computeArea();

69. shape.computeVolume();

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

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

72. }

73. }


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

74. circlearea:529.2967869138698

75. circlevolume:0.0

76. Spherearea:2050.8395382450512

77. Spherevolume:69865.26693621474


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


78. ...

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

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

81. shape[i].computeVolume();

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

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

84. }


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

分享到:
评论

相关推荐

    Java语言程序设计

    2.4 应用举例 2.4.1 声明BankAccount类 2.4.2 声明toString()方法 2.4.3 声明存取款方法 2.4.4 使用DecimalFormat类 2.4.5 声明类方法生成特殊的实例 2.4.6 声明类变量 2.5 UML简介 2.5.1 类图 2.5.2 对象...

    java初学者必看

    尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,不妨过来讨论一下哦! 第1章 Java概述 1.1 Java的发展史 1.1.1 Java起源 1.1.2 Java发展 1.2 Java是什么 1.2.1 Java语言 1.2.2 Java平台 1.2.3 ...

    面向对象程序设计与实践-Java抽象类和接口[33页].pptx

    使用接口实现多态 本章以理论讲解、案例演示、代码分析为主。学习本章内容之前,建议同学们先了解"案例描述",带着设计要求学习案例中涉及的知识点,然后动手进行编码实现,需要注意的是: 1.案例5-1的重点在于抽象...

    程序开发原理:抽象、规格与面向对象设计.[美]Barbara Liskov(带详细书签).pdf

    书中讨论了怎样构建具有高可靠性、易于维护和快速修改的软件的开发方法,强调了软件的模块化开发思想,用丰富的实例告诉读者怎样进行模块化并合理地组织各种模块以构成大型软件系统的过程。该书的前8章首次提出编程...

    Java的六大问题你都懂了吗

    如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。[ nextpage]  四、final关键字到底修饰了什么?  final使得被...

    JAVA程序设计教程

    Java程序.............................................................................................6 1.3.1 Java程序的结构 ...........................................................................

    Spring面试题

    在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,...

    asp.net知识库

    将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 ...

    在一小时内学会 C#(txt版本)

    本文通过一系列例程以简短但全面的方式讨论了 C# 语言构造和特性,所以你仅需略览代码片刻,即可了解其概念。 注意:本文不是为 C# 宗师而写。有很多初学者的 C# 文章,这只是其中之一。 接下来关于 C# 的讨论主题...

    收集的常见的专业问题解决办法.rar

    2009-02-24 08:39 1423088 975149 常见的专业问题解决办法\Java中多态变量的讨论和总结.mht 2009-02-24 08:52 156256 34316 常见的专业问题解决办法\Java中的强制类型转换_Believe ┭┮ YourSelf.mht 2009-02-24 08:...

    PHPWeb开发技术指南——pdf格式

    2.7 多态和自变代码 62 2.7.1 动态函数生成程序 63 2.7.2 自变计数器 67 2.8 小结 68 第3章 应用程序设计:一个实际的例子 69 3.1 项目概观 69 3.2 比较技术环节 70 3.3 IRC网络基础 73 3.4 使应用程序适用于网络 75...

    PHP4.0 高级篇

    2.7 多态和自变代码 62 2.7.1 动态函数生成程序 63 2.7.2 自变计数器 67 2.8 小结 68 第3章 应用程序设计:一个实际的例子 69 3.1 项目概观 69 3.2 比较技术环节 70 3.3 IRC网络基础 73 3.4 使应用程序适用于网络 75...

    编程技能训练与等级考试辅导:类和对象.pptx

    使用对象进行程序设计,将数据与对数据的处理封装在一个对象中,通过对象之间的协调(发送消息)来完成一个个任务。 特点: 封装、代码重用、多态 优点: 数据安全、隐蔽、容易维护。 可以重用、继承等;同一类对象的...

    C#微软培训资料

    15.4 接口的实现 .182 15.5 抽象类与接口 .195 15.6 小 结 .196 第十六章 组织应用程序 .198 16.1 基 本 概 念 .198 16.2 使用名字空间 .200 16.3 使用指示符 .203 16.4 程 序 示 例 .206 16.5 小 ...

Global site tag (gtag.js) - Google Analytics