Java中多态性的实现

一、什么是多态

1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。

2.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

4.多态的作用:消除类型之间的耦合关系。

5.现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

多态存在的三个必要条件

1、要有继承;

2、要有重写;

3、父类引用指向子类对象。

二、多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。

4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载

下面是个经典例子:

[java] view plaincopy
  1. /*
  2. 对象的多态性:动物 x = new 猫();
  3. 函数的多态性:函数重载、重写
  4. 1、多态的体现
  5. 父类的引用指向了自己的子类对象
  6. 父类的引用也可以接收自己的对象
  7. 2、多态的前提
  8. 必须是类与类之间只有关系,要么继承或实现
  9. 通常还有一个前提,存在覆盖
  10. 3、多态的好处
  11. 多态的出现大大的提高了程序的扩展性
  12. 4、多态的弊端
  13. 只能使用父类的引用访问父类的成员
  14. 5、多态的应用
  15. 6、注意事项
  16. */
  17. /*
  18. 需求:
  19. 猫,狗。
  20. */
  21. abstract class Animal
  22. {
  23. abstract void eat();
  24. }
  25. class Cat extends Animal
  26. {
  27. public void eat()
  28. {
  29. System.out.println("吃鱼");
  30. }
  31. public void catchMouse()
  32. {
  33. System.out.println("抓老鼠");
  34. }
  35. }
  36. class Dog extends Animal
  37. {
  38. public void eat()
  39. {
  40. System.out.println("吃骨头");
  41. }
  42. public void kanJia()
  43. {
  44. System.out.println("看家");
  45. }
  46. }
  47. class DuoTaiDemo
  48. {
  49. public static void main(String[] args)
  50. {
  51. function(new Cat());
  52. function(new Dog());
  53. Animal a = new Cat();//向上转型
  54. a.eat();
  55. Cat c = (Cat)a;//向下转型
  56. c.catchMouse();
  57. }
  58. public static void function(Animal a)
  59. {
  60. a.eat();
  61. //用于子类型有限
  62. //或判断所属类型进而使用其特有方法
  63. if(a instanceof Cat)
  64. {
  65. Cat c = (Cat)a;
  66. c.catchMouse();
  67. }
  68. else if(a instanceof Dog)
  69. {
  70. Dog c = (Dog)a;
  71. c.kanJia();
  72. }
  73. }
  74. }

执行结果为:

[java] view plaincopy
  1. 吃骨头
  2. 看家
  3. 吃鱼
  4. 抓老鼠

在上面的实例中,我们看到两个名词“向上转型”和“向下转型”,我们要理解多态,就必须要明白什么是“向上转型”及“向下转型”。

在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,Animal是父类,Cat 和 Dog是子类。我们定义如下代码:

Animal  a = new  Dog();

在这里我们这样理解,这里定义了一个 Animal 类型的a,它指向 Dog 对象实例。由于Dog 是继承 Animal,所以 Dog 可以自动向上转型为Animal,所以 a 是可以指向Dog 实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。

但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,却不能调用子类中的方法和属性。

若我们向调用子类中的方法怎么办呢?这就利用到了“向下转型”,在代码中的体现就是:

[java] view plaincopy
  1. Cat c = (Cat)a;//向下转型
  2. c.catchMouse();

总结如下:

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

Java 三大特性 —— 多态相关推荐

  1. Java三大特性——多态

    多态 面向对象的计算机编程语言的三大特点: 继承,封装,多态 多态:一个引用,能表现出多种形态. 多态的条件: 继承(查看之前博客--继承) 重写 即子类实现父类的同名方法,且参数类型与参数个数与父类 ...

  2. java三大特性:封装、继承、多态

    2019独角兽企业重金招聘Python工程师标准>>> 至今记得若干年前,去面试排了半天的队,到我的时候,面试官问我的第一个问题,java三大特性是什么~我支支吾吾的没有答全~0.0 ...

  3. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  4. java 三大特性理解_java 三大特性--封装、继承和多态理解

    java 三大特性--封装.继承和多态理解 封装 /** * 所谓封装,就是将对象具有的成员变量和成员函数包装和隐藏起来,让外界无法直接使用, * 被封装的成员只能通过某些特定的方式才能访问. * 实 ...

  5. Java三大特性(封装、继承、多态)详细讲解

    文章目录 封装 1 封装的好处 2 简单实现 继承 一.类继承简单实现 父类:动物类 子类 猫类 狗类 二.类继承的详细讲解 1. 类继承中成员变量的访问 1.1 成员变量之间的访问 (变量不重名的情 ...

  6. java三大特性、五大原则

    java三大特性 1.封装 隐藏类的属性和功能实现,增强类的安全性和简化编程,通过提供公用接口,以特定的访问权限来使用类成员. 2.继承 对共有的特性和行为进行抽取,形成父类,继承就是子类继承父类的特 ...

  7. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性--多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  8. java三大特性 继承_java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  9. Java提高篇 —— Java三大特性之继承

    一.前言 在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事 ...

最新文章

  1. python document_python 处理document文档 保留原样式
  2. 【译】Introduction to Byteball — Part 1: Why?
  3. 无向图:计算亏格(环的孔洞)
  4. Android学习笔记09:Paint及Canvas的简单应用
  5. 最简单的基于FFmpeg的移动端例子:IOS 视频转码器
  6. 在c语言程序中整型常量不能表示的数制是,C源程序中不能表示的数制有哪些
  7. crystalReportViewer+ReceiveCrystalReport.rpt+DataSet.xsd做报表 转
  8. Thinking in java-29  解耦合Decouple
  9. R 回归 虚拟变量na_互助问答第92期:虚拟变量问题
  10. 武汉理工计算机研究生就业去向统计,武汉理工大学《2019届毕业生就业质量报告》发布,本科生月薪7333...
  11. 视觉分类任务中,Confusion Matrix (混淆矩阵) 的绘制
  12. SpringBoot邮件发送
  13. Android 4.2虚拟按键背景透明,Android 4.0 隐藏虚拟按键(导航栏)的方法
  14. Programming Rust Fast, Safe Systems Development(译) 表达式(第六章 完)
  15. 【C语言从青铜到王者】第零篇·与C语言来个约会
  16. Linux网络代理服务器搭建及使用
  17. buildroot GNU strip分析
  18. 超级计算机的配置,第一章 最新GPU并行计算超级计算机配置全集.pdf
  19. 1062 Talent and Virtue(排序)
  20. 女装分类有哪些?(详细女装分类)

热门文章

  1. Android二维码之创建
  2. JAVA基础----java中E,T,?的区别
  3. 深入了解tcmalloc(一):windows环境下无缝拦截技术初探
  4. 本地同时修改2个版本
  5. linux 内核配置过程中遇到的问题
  6. 我的blog开张了,希望大家能多多赏光啊
  7. 重学TCP协议(9) 半连接队列、全连接队列
  8. leetcode 978. 最长湍流子数组(滑动窗口)
  9. vtk删除一个actor_如何构建一个基于actor的简单区块链
  10. intern_充分利用Outreachy Intern申请流程