面向对象程序设计的三大支柱是封装、继承和多态。本篇文章主要讲述多态的相关知识。

一、概述

1.定义

多态意味着父类的变化可以指向子类对象;它是同一行为具有不同表现形式或形态的能力。

ps:一个类实际定义了一种类型。子类定义的类型称为子类型;父类定义的类型称为父类型。

2.要实现多态需要满足一下几个条件:

  • 有继承关系
  • 有方法重写(抽象方法)
  • 有父类引用指向子类对象

3. 多态的优点

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

4. 多态的弊端

(1)不能使用子类的特有功能

如果想使用,一种方法就是创建子类对象调用方法(可以但是很多时候不合理,而且太占内存),另一种方式把父类的引用强制转换为子类的引用(向下转型)

(2)对象间的转型问题

向上和向下,其实就是父和子的关系,父为上,子为下。

向上转型

Fu f = new Zi();

 向下转型

Zi z = (Zi)f;   // 要求f必须能够转为Zi

举例说明

class Fu {public void show() {System.out.println("show Fu");}
}class Zi {public void show() {System.out.println("show Zi");}public void method() {System.out.println("method Zi");}
}class DuoTaiDemo2 {public static void main(String[] args) {Fu fu = new Zi();fu.show();// fu.method(); 错误,不能使用子类特有功能// 通过转型可以使用子类特有功能// 创建子类对象// 可以但是不推荐Zi zi = new Zi();zi.show();zi.method();// 要求f必须能够转为Zi// 推荐()Zi zi2 = (Zi)fu;}
}

5.与生活中的实例进行类比

现实中,比如我们按下 F1 键这个动作:

  • 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
  • 如果当前在 Word 下弹出的就是 Word 帮助;
  • 在 Windows 下弹出的就是 Windows 帮助和支持。

同一个事件发生在不同的对象上会产生不同的结果。

二、格式

parent p = new Chile();
  • 把子的对象赋值给父
  • 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

这里先举几个例子帮助大家理解:

例1

public class PolymorphismDemo{public static void main(String[] args){displayObject(new CircleFromSimpleGeometricObject(1,"red",false));displayObject(new RectangleFromSimpleGeometricObject(1,"red",true));}public static void displayObject(SimpleGeometricObject object){System.out.prinyln("Created on"+object.getDateCreaded()+".Color is"+object.getColor());}
}

运行结果:

Created on Mon Mar 09 19:25:20 EDT 2011.Color is red

Created on Mon Mar 09 19:25:20 EDT 2011.Color is black

方法displayObject 具有GeometricObject类型的参数。可以通过传递任何一个GeometricObject的实例和new CircleFromSimpleGeometricObject(1,"red",false)来调用displayObject 。使用父类对象的地方都可以使用子类对象。这就是通常所说的多态。

例2

public class Test {public static void main(String[] args) {show(new Cat());  // 以 Cat 对象调用 show 方法show(new Dog());  // 以 Dog 对象调用 show 方法Animal a = new Cat();  // 向上转型  a.eat();               // 调用的是 Cat 的 eatCat c = (Cat)a;        // 向下转型  c.work();        // 调用的是 Cat 的 work}  public static void show(Animal a)  {a.eat();  // 类型判断if (a instanceof Cat)  {  // 猫做的事情 Cat c = (Cat)a;  c.work();  } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a;  c.work();  }  }
}abstract class Animal {  abstract void eat();
}  class Cat extends Animal {  public void eat() {  System.out.println("吃鱼");  }  public void work() {  System.out.println("抓老鼠");  }
}  class Dog extends Animal {  public void eat() {  System.out.println("吃骨头");  }  public void work() {  System.out.println("看家");  }
}

运行结果:

吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

三、多态中成员的访问方法

在学习多态时,有一句广为流传的口诀:编译看左边,运行看右边。但其实它是针对非静态方法说的,而成员变量、静态方法都是只看左边。

下面举一个例子来证明上述结论:

父类

public class Father {int num = 520;static void staticMethod() {System.out.println("父类静态方法");}void normalMethod() {System.out.println("父类普通方法");}
}

子类

class Son extends Father {int num = 1314;static void staticMethod() {System.out.println("子类静态方法");}@Overridevoid normalMethod() {System.out.println("子类普通方法");}
}

测试类

class Test {public static void main(String[] args) {Father f = new Son();// 与父类一致System.out.println(f.num);// 与父类一致f.staticMethod();// 编译时与父类一致,运行时与子类一致f.normalMethod();Son z = new Son();System.out.println(z.num);z.staticMethod();z.normalMethod();}
}

运行结果

520

父类静态方法

子类普通方法

1314

子类静态方法

子类普通方法

四、多态的实现形式

1.重写

2.接口

  • 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
  • java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。

3.抽象类和抽象方法

Java面向对象程序设计三大支柱--多态相关推荐

  1. 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态

    Java面向对象编程三大特征 - 多态 本文关键字:Java.面向对象.三大特征.多态 多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一.在理解多态之前需要先掌握继承.重写.父类引用指向 ...

  2. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  3. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  4. 面向对象的三大支柱:继承,封装,多态

    /* 面向对象的三大支柱:继承,封装,多态. */ 下面我就对面向对象的三大支柱简单的谈一谈,自己在学习过程中的一些领悟. 封装: 封装时指隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式.在封装 ...

  5. 20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告

    20155328 <Java程序设计> 实验二(Java面向对象程序设计) 实验报告 单元测试 一.单元测试和TDD 编程时需理清思路,将编程需求等想好,再开始编.此部分可用伪代码实现. ...

  6. java面向对象程序设计第三版_JAVA面向对象程序设计之创建型设计模式

    [本文详细介绍了JAVA面向对象程序设计中的创建型设计模式,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 什么是设计模式 设计模式( Design pattern )是一套被反复使用.多数 ...

  7. 20175333曹雅坤 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  8. 20145122《Java面向对象程序设计》实验二实验报告

    实验名称: Java面向对象程序设计 实验内容: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 PSP时间 步骤 ...

  9. Java第二次实验报告——Java面向对象程序设计

    北京电子科技学院(BESTI) 实    验    报    告 课程名称:java程序设计实验      班级:1352         姓名:洪韶武      学号:20135219 成绩:   ...

最新文章

  1. Java面试题大汇总,2021年附答案解析
  2. python定义变量并赋值_Python 变量类型及变量赋值
  3. 开源免费的HTML5游戏引擎
  4. 手绘风格的数据可视化 (萌萌风)Sketchify,及其他可视化工具(商业风)
  5. beetl 时间输出格式化
  6. web容器(02):tomcat配置监控
  7. java openmp库_OpenMP的环境变量及库函数
  8. 弹载计算机的上市公司,基于无线通信的弹载计算机系统BIT设计
  9. Lambda表达式将数组/字符串列表转换为数组/整数列表
  10. 今日花生价格多少钱一斤?
  11. “Java引领技术人生”专题讲座——Java畅销书作者李刚巡讲活动
  12. java p2p实例_java文件p2p传输
  13. Java后端技术概览
  14. html5shiv源码,前端开发必配置:html5shiv.js和respond.min.js的作用说明!
  15. oracle12c分片应用场景,Oracle 12cR2数据库(Oracle12.2)新特性之四:Sharding 的增强...
  16. 中小企业成本的会计核算方法
  17. 更改已生成的exe文件的ico图标
  18. 让Fireball CodeEditor控件支持中文
  19. 超分辨率重建——关于YIQ空间
  20. codeforces 730 A Toda 2

热门文章

  1. 你真的会用搜索引擎吗?
  2. AIQ - deeplearning.ai 全套吴恩达老师的深度学习课程笔记及资源在线阅读
  3. Double-checked locking should not be used
  4. 看电影(C++结构体练习题)
  5. 不懂数据库索引的底层原理?那是因为你心里没点b树
  6. 滤波器原理及其作用计算机网络,滤波器的种类/作用/原理
  7. Educoder--Java面向对象(第八章) - 文件类
  8. Mac 电脑启动的快捷键
  9. intel 服务器芯片组 c6,Intel 10nm至强主板偷跑:型号“IMB700” 基于C621A芯片组
  10. 张量分析入门笔记 (Tensor For Beginner)