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

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

Java实现多态有 3 个必要条件:继承、重写、父类(或接口)的引用指向子类对象(向上转型)。

继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将父类引用指向子类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
下面通过一个例子来演示重写如何实现多态性。例子使用了类的继承和运行时多态机制,具体步骤如下。

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
===============================
父类中计算对象面积的方法,没有实际意义,需要在子类中重写。

Java中的多态:什么是多态?相关推荐

  1. Java中继承、接口、多态的作用详解(纯理论)

    一.继承.接口与多态的相关问题: 1. 继承的作用?好处?坏处? 继承:通过继承实现代码复用.Java中所有的类都是通过直接或间接地继程java.lang.Object类得到的.继承而得到的类称为子类 ...

  2. java 包装类可以被继承_【Java基本功】一文了解Java中继承、封装、多态的细节...

    本节主要介绍Java面向对象三大特性:继承 封装 多态,以及其中的原理. 本文会结合虚拟机对引用和对象的不同处理来介绍三大特性的原理. 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来 ...

  3. java中访问修饰符,多态

    1 java中的访问修饰符 1 表格 修饰符 本类 本包其他类(子类) 子类(本项目) 其他包 访问权限 public √ √ √ √ 公用的(对任何人都可以用) protect √ √ √ × 受保 ...

  4. 简述Java中封装,继承,多态的理解

    1.封装 意义:防止数据被无意破坏. 如何实现:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法. 好处: 它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作. ...

  5. java中封装、继承、多态的理解

    封装就是把普通的对象进行封装,对象的属性设为私有的,对外提供get和set方法,其他类只能通过get和set对对象属性值进行操作. 继承是发生在两个类之间,一个类继承另一个类,是说这个类属于另一个类, ...

  6. java中函数的重载_Java中函数的重载

    函数的重载 1.同一个类 2.同名函数 3.参数个数不同或者参数类型不同 4.java是严谨性语言,如果函数出现的调用的不确定性,会编译失败. public static int add(int a, ...

  7. java中的多态_Java中的多态

    多态与HoFs 朋友们好久不见啊,最近笔者同时在写脚本型语言--JavaScript,和工业级的面向对象语言--Java. 在写代码的同时呢,也会思考这些语言的不同.今天就拿 Java 中的多态,来谈 ...

  8. 何为Java 中的多态?

    Java 中的多态一般分为两种:重写式多态和重载式多态. 重载式多态,也叫编译时多态.也就是说这种多态再编译时已经确定好了.重载大家都知道,方法名相同而参数列表不同的一组方法就是重载.在调用这种重载的 ...

  9. Java中的多态(for myself)

    我记得这是大学上课的时候考试最爱考的题目.Java的多态. 多态 Java引用变量时有两个类型: 一个是编译时类型,一个是运行时类型. 编译时类型由申明该变量时使用的类型决定 运行时类型由实际赋值给该 ...

  10. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

最新文章

  1. [单刷APUE系列]第五章——标准I/O库
  2. 什么是Redis?简述它的优缺点?
  3. java加密 c解密_java+加密解密
  4. [Flink]Flink常用的DataStream转换算子
  5. Djangon 基础总结 汇总 从请求到返回页面的过程,
  6. Atititjs h5调用摄像头视频聊天 拍照功能 相机功能 录像attilax总结
  7. oracle sqlplus命令登录数据库
  8. Matlab学习笔记(一)--数值数据
  9. POJO和po,vo,bo
  10. html画圆圈加感叹号,感叹号怎么打 拜托了是两个并在一起的叹号,
  11. 云产品测试软件,云测试工具平台介绍
  12. 技术专栏|多旋翼飞行器振动机理分析和减振设计
  13. 【山大智云开发日志】项目安装与部署
  14. 笔记:模电-1.2二极管
  15. canvas实现高阶贝塞尔曲线
  16. STM32F107的时钟设置由25M修改成8M
  17. ad服务器做虚拟化,VMware ESXi 4.1新特性之AD服务器集成
  18. linux 配置阿里云ddns 定时任务定时更新
  19. 数码计算机英语翻译,数码用英语怎么说
  20. java备忘录模式_Java设计模式之备忘录模式

热门文章

  1. 【正点原子FPGA连载】第十五章 RGB LCD彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  2. title标签-HTML5精讲 课时ID:6.4 【表严肃】#HTML教程 #HTML5教程 #title标签
  3. fatal error: juce_core.h: No such file or directory
  4. 使用moveTaskToBack重新进入调用了onDestroy
  5. 华清远见上海中心班--11.17作业
  6. DNSPod十问周康:如何成为办公硬件领域的乔布斯?
  7. 信息可视化中的时间线设计,不懂的过来
  8. Raft 协议原理详解
  9. DevOps自动化组件-RUNDECK介绍、开发、部署、使用
  10. C语言程序——指针(1)