文章目录

  • Java面向对象特征之三 多态
    • 1.多态的定义
    • 2.多态的分类
      • 静多态
      • 动多态
    • 3.向上造型
      • 向上造型的好处
    • 4.多态实例演示
    • 5.多态的实现原理
    • 6.多态的深入理解
      • 6.1 静多态(静态绑定,编译期多态)
      • 6.2 动多态(动态绑定,运行时多态)
    • 多态的优点
      • 可替换性
      • 可扩充性
      • 接口性

Java面向对象特征之三 多态

1.多态的定义

多态是同一个行为具有多种不同的表现形式或形态的能力。允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
比如黑白打印机和彩色打印机,对打印的操作黑白打印机打印的效果是黑白的,彩色打印机打印出来的效果是彩色的;比如学生和老师,学生的工作是学习,老师的工作是授课;再比如对于一只雄鹰和一只猎豹,雄鹰的运动方式是飞翔,猎豹的运动方式是奔跑。
可见,同一行为,通过不同的事物,可以体现出来的不同的形态,这就是多态。

2.多态的分类

静多态

静多态(静态绑定)----编译期多态
静态多态性指的是程序在编译时,系统就能决定调用哪个函数。
如方法重载问题,条件:

相同作用域
函数名相同
参数列表不同

动多态

动多态(动态绑定)----运行期多态
动态多态性指在运行中才能动态确定操作指针所指的对象。
动多态条件:

继承
方法重写
向上造型

在这里我们介绍动多态问题!

3.向上造型

向上造型用一句话来说就是基类的引用 引用 派生类的对象,基接口的引用 引用 实现该接口的类对象

在上述图例中,People类是Student的基类,当People类对象的引用变量引用子类Student类对象时就是向上造型。如下:
People people = new Student();
people引用.出来的方法是父类的方法接口,但是方法的实现却是子类的实现方式。
Java 的多态机制遵循一个原则:当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法 。

向上造型的好处

减少重复代码,使代码变得简洁。
提高系统扩展性。

4.多态实例演示

定义一个People类

public class People {//实例变量protected String name;protected int age;//构造方法public People(String name,int age) {this.name = name;this.age = age;}//实例方法public void work() {System.out.println("工作");}
}

定义一个Student类继承People类

public class Student extends People{//实例变量private int score;private int stu_id;//构造方法public Student(String name,int age,int score, int stu_id) {super(name,age);//调用父类的有参构造函数,初始化从父类继承下来的实例变量this.score = score;this.stu_id = stu_id;}@Overridepublic void work() {System.out.println("学习");}
}

定义一个Teacher类继承People类

public class Teacher extends People{int tea_id;public Teacher(String name, int age,int tea_id) {super(name, age);this.tea_id = tea_id;}@Overridepublic void work() {System.out.println("授课");}
}

图示关系:

使用方式:

public class TestDemo {public static void main(String[] args) {People p = new Student("zs",18,100,19060611);p.work();People p2 = new Teacher("Lisi",27,1911111);p2.work();}
}

运行结果及分析:

通过运行结果我们发现,引用变量p调用的work()是子类Student的方法,引用变量p1调用的work()是子类Teacher的方法。

5.多态的实现原理

多态的实现原理:地址覆盖
以实例中People p = new Student(“zs”,18,100,19060611);为例
图示:

首先我们在Java堆上创建了一个Student对象,People类的引用变量p指向了Student对象,Student对象中的对象头里有一个Class引用,Class引用里保存着Class对象的地址,Class对象是在类加载阶段产生的,一个类一个Class对象,保存当前类的类信息,比如实例变量、实例方法,用Class对象里的RTTI(Run-Time Type identification)机制,运行时进行类型信息识别,通过Class对象找到方法区中该类的方法表,方法表中有从父类继承下来的方法,还有自己方法,父类People中有一个work()方法,子类继承了下来保存在了方法表中,子类中也有个work()方法,对People类中的方法进行了重写,而在方法表中子类的work()方法地址对父类的work()方法地址进行了覆盖,所以当People类的引用变量p调用work()时调用的是子类当中的work()方法。

6.多态的深入理解

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

6.1 静多态(静态绑定,编译期多态)

静多态也称编译时的多态,就是我们所说的方法重载。相同的方法名,根据形参类型个数或类型的不同调用不同的方法。在编译期间就已经确定要调用的方法。

6.2 动多态(动态绑定,运行时多态)

所谓动多态就是指程序中定义的引用变量所引用具体对象类型以及通过该引用变量进行方法调用时在编译期并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

多态的优点

可替换性

多态对已存在代码具有可替换性。例如,多态对People类设计,对其他任何人类,如学生,老师也同样具有工作的行为。

可扩充性

多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。

接口性

多态是父类通过方法声明,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。

Java面向对象特征之三 多态相关推荐

  1. java面向对象特征及阐述,Java面向对象四个特征

    Java面向对象有四个特征:抽象.封装.继承.多态.其中封装.继承.多态又被称为Java的基本特征. 抽象: Java中会把客观事物抽象成一个类.类就是封装了数据以及操作这些数据的代码逻辑实体.用字符 ...

  2. Java面向对象特征介绍

    面向对象不仅仅在java中有体现,在C++中也有.Java面向对象三大特征 封装和隐藏 继承 多态 1.封装和隐藏 Java中通过将数据声明为private私有,再提供公共(public)的方法,ge ...

  3. Java 面向对象特征

    java面向对象的三大特征是什么? 那就是封装.继承.多态. 但说到面向对象,还有一个很主要的特征就是抽象. 封装 每一个类中都会有属性和方法,封装指的就是把属性和方法隐藏起来,只保留一些对外的接口和 ...

  4. Java面向对象特征有那些

    一.java面向对象的特征? 答:java面向对象的特征:封装.继承.多态.抽象. 如果问java面向对象的三大特征是什么?那就是封装.继承.多态, 但说到面向对象,还有一个很主要的特征就是抽象. 1 ...

  5. java面向对象特征

    java面向对象的特征:封装,继承,抽象,多态: --1--.封装: 什么叫做封装? 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口. 面向对象计算始于这个基本概念,即现实世界可以被描绘 ...

  6. JavaSE-No.8——Java三大特征之多态

    JavaSE传送门 JavaSE_Start JavaSE-No.7.1--Java的继承(super关键字) JavaSE-No.7.2--Java的继承(与组合) 目录 1. 多态的概念 2. 多 ...

  7. java继承封装英语怎么说,英语翻译深刻理解JAVA OOP编程,熟练于封装、继承、多态、抽象等JAVA面向对象特征的使用,对常用集合有较深理解,以...

    共回答了16个问题采纳率:87.5% Deep understanding of Java Object Oriented Programming. Able to use encapsulation ...

  8. java面向对象--继承与多态

    1.1自定义包语法: package <包名> 注意:声明一个包的语句必须写在类中的第一行. 如:创建hero类,将该类存放到com.java.oriented.dato.figure包中 ...

  9. (十)Core Java 面向对象(封装,继承,多态,接口) -02 (96)

     目录 :        24 ). 面向对象(聚集关系) 25 ). 面向对象(子父类中变量的特点) 26 ). 面向对象(子父类中函数的特点-覆盖) 27 ).  面向对象(子父类中构造函数的特点 ...

最新文章

  1. 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
  2. r语言中mpg数据_R语言常用的数据处理的包(1)
  3. 我是如何学习写一个操作系统(九):文件系统
  4. 第十六周项目3-有相同数字?
  5. 如何学好前端,这5点你一定要知道!
  6. css hsla和rgba的区别
  7. 创建硬链接避免重装系统数据丢失
  8. 挂钩SSDT详解附源代码
  9. python爬虫网易云音乐评论最多的歌_网易云音乐歌曲评论爬虫
  10. win7字体安装_PR CC 下载和安装教程
  11. h3c服务器登录密码修改,H3C交换机配置ssh密码验证登录方式
  12. 代理是什么?(HTTP代理,SOCKS代理)
  13. 小米node2红外_小米监控open-falcon-0.2安装部署详细配置
  14. RF信号下采样/矩阵下采样(附python实现代码)
  15. 图像语义分割实践(三)模型搭建与实现
  16. Linux服务器上测试TCP/UDP端口的连通性
  17. Hbuilderx是html5,HBuilderX代码提示系统说明
  18. java实现第七届蓝桥杯平方末尾
  19. java面向对象知识点整理--用前人智慧,为后人铺路
  20. java c 转换_由javac完成的任何类型的转换?

热门文章

  1. iPhone 4 问世 | 历史上的今天
  2. QT的QTableWidget滚动条设置--非常全
  3. python关于excel格式刷_这些Excel学会了,你做账的效率将大大提高
  4. android mp3进度条和时间,AndroidStudio音乐播放器进度条和歌曲时间的操作
  5. 计算机应用基础的知识探索,关于中职《计算机应用基础》教学的探索
  6. 蓝桥杯嵌入式第三课--LED与按键检测
  7. wince6.0桌面背景+设置默认IP+开机自动运行程序
  8. Elixir 函数式编程语言
  9. Android 仿Win8的metro的UI界面(上)
  10. Django反向解析