多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。

Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

例 1
下面通过一个例子来演示重写如何实现多态性。例子使用了类的继承和运行时多态机制,具体步骤如下。

1)创建 Figure 类,在该类中首先定义存储二维对象的尺寸,然后定义有两个参数的构造方法,最后添加 area() 方法,该方法计算对象的面积。代码如下:

public class Figure {double dim1;double dim2;Figure(double d1, double d2) {// 有参的构造方法this.dim1 = d1;this.dim2 = d2;}double area() {// 用于计算对象的面积System.out.println("父类中计算对象面积的方法,没有实际意义,需要在子类中重写。");return 0;}
}

2)创建继承自 Figure 类的 Rectangle 子类,该类调用父类的构造方法,并且重写父类中的 area() 方法。代码如下:

public class Rectangle extends Figure {Rectangle(double d1, double d2) {super(d1, d2);}double area() {System.out.println("长方形的面积:");return super.dim1 * super.dim2;}
}

3)创建继承自 Figure 类的 Triangle 子类,该类与 Rectangle 相似。代码如下:

public class Triangle extends Figure {Triangle(double d1, double d2) {super(d1, d2);}double area() {System.out.println("三角形的面积:");return super.dim1 * super.dim2 / 2;}
}

4)创建 Test 测试类,在该类的 main() 方法中首先声明 Figure 类的变量 figure,然后分别为 figure 变量指定不同的对象,并调用这些对象的 area() 方法。代码如下:

public class Test {public static void main(String[] args) {Figure figure; // 声明Figure类的变量figure = new Rectangle(9, 9);System.out.println(figure.area());System.out.println("===============================");figure = new Triangle(6, 8);System.out.println(figure.area());System.out.println("===============================");figure = new Figure(10, 10);System.out.println(figure.area());}
}

从上述代码可以发现,无论 figure 变量的对象是 Rectangle 还是 Triangle,它们都是 Figure 类的子类,因此可以向上转型为该类,从而实现多态。

5)执行上述代码,输出结果如下:

长方形的面积:
81.0
===============================
三角形的面积:
24.0
===============================
父类中计算对象面积的方法,没有实际意义,需要在子类中重写。
0.0

1.9 多态性:什么是多态?相关推荐

  1. tcga癌症亚型获取_将亚型多态性与通用多态性相关联的危险

    tcga癌症亚型获取 Java 5已将通用多态性引入Java生态系统. 即使我们都知道由于泛型类型擦除及其后果而引起的无数警告,这还是对Java语言的重要补充. 通用多态性(也称为参数多态性 )通常与 ...

  2. 将亚型多态性与通用多态性相关联的危险

    Java 5已将通用多态性引入Java生态系统. 即使我们都知道由于泛型类型擦除及其后果而引起的无数警告,这对Java语言还是一个很大的补充. 通用多态性(也称为参数多态性 )通常与可能预先存在的亚型 ...

  3. 解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!

    Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的 ...

  4. 设计代码说明什么是多态性?如何实现多态?(代码中要写注释解释)_狗屎一样的代码!快,重构我...

    关注后你就是我的人了 重构不止是代码整理,它提供了一种高效且受控的代码整理技术. (一)重构原则 1.何谓重构 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修 ...

  5. 设计代码说明什么是多态性?如何实现多态?(代码中要写注释解释)_狗屎一样的代码!快,重构我!...

    狗屎一样的代码如何重构? 重构不止是代码整理,它提供了一种高效且受控的代码整理技术. (一)重构原则 1.何谓重构 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低 ...

  6. Python类的多态和多态性

    很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗. 一.多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 序列数据类型有多种形态 ...

  7. python中对多态和多态性的理解

    一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal(metaclass=abc. ...

  8. C++多态的实现原理

    1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表.类的对象有一个指向虚表开始的虚指针.虚表是和类对应的,虚表指针是和对象 ...

  9. python全栈脱产第25天------组合、多态、封装、property装饰器

    一.组合 定义:组合指的是一个对象属性的值是另一个类的对象 用途:通过某一对象添加属性(属性的值时另一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起,从而减少代码冗余 用法: class ...

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

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

最新文章

  1. XHTML5 与 HTML 4.01的差异
  2. 2014Esri国际用户大会ArcGIS Online
  3. 【转】谈谈三层架构中MODEL的作用
  4. python硬件测试开发_用python实现高性能测试工具(一)
  5. 利用规划图提高经典人工智能规划复杂度
  6. docker 安装elasticsearch
  7. mysql-数据库的增删切换使用等操作
  8. 网络爬虫程序 *版本1.0.1* 修正几个问题
  9. n-Track Studio Suite 9 Mac(多轨音乐制作工具)
  10. 1.2Android系统移植的主要工作
  11. 让网页附件为Word或Excel的文件,下载时直接弹出下载对话框,而不打开它
  12. python贪心算法几个经典例子_闲来无事整一下贪心算法 用python实现的
  13. 软件测试的艺术读书笔记
  14. 如何下载静海区卫星地图高清版大图
  15. 计算机网络路由器的配置连接不上,路由器安装设置好后电脑还是不能上网解决办法...
  16. 网络空间安全 渗透 攻防5(文件共享服务器)
  17. USACO 2018 January Contest
  18. 【算法练习】CodeVs1391 伊吹萃香(分层图最短路)
  19. 京东数据分析工程师(实习生)笔试
  20. C++取整数与取小数的函数和方法

热门文章

  1. 元计算:《元计算破解生命密码》听课笔记
  2. 成功解FileNotFoundError: [Errno 2] No such file or directory: './data\\mnist\\train-images-idx3-ubyte'
  3. 洛谷——P1183 多边形的面积
  4. Java中Connection方法笔记
  5. CODEVS1490 [CTSC2008]网络管理
  6. android缓存之Lrucache 和LinkedHashMap
  7. Tomat6架构探讨(二续)
  8. 微众WeCross 跨链平台(5)“UBI通用区块链接口”设计
  9. 智能合约重构社会契约(7)以太坊总结
  10. Goroutine池