Java多态的理解

目录

一.多态的定义

二.动态绑定

三.对多态的理解

四.多态的必要条件及其优点


一.多态的定义

 多态意味着父类型的变量可以引用子类型的对象。

面向对象程序设计的三大支柱是封装继承多态。 继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。

考虑下图中的代码。

方法displayObject(第9行)具有GeometricObject类型的参数。可以通过传递任何一个GeometricObject的实例(例如∶在第6和7行的new Circle(1,"red",false)和new Rectangle(1,1,"black",true))来调用display0bject。使用父类对象的地方都可以使用子类的对象。这就是通常所说的多态(polymorphism,它源于希腊文字,意思是"多种形式")。

简单来说,多态意味着父类型的变量可以引用子类型的对象

二.动态绑定

动态绑定工作机制如下∶假设对象o是类C,C2,…,Cn-1,Cn。的实例,其中C1是C2的子类,C2是C3的子类,…,Cn-1是Cn的子类。也就是说,Cn是最通用的类,C1是最特殊的类。在 Java中,Cn是 0bject类。如果对象o调用一个方法p,那么JVM会依次在类C1,C2,…,Cn-1,Cn。中查找方法p的实现,直到找到为止。一旦找到一个实现,就停止查找,然后调用这个首先找到的实现。

下图给出一个演示动态绑定的例子。

方法m(第12行)有一个0bject类型的参数。可以用任何对象(例如∶在第6~9行的new GraduateStudent()、new Student()、new Person()和 new Object()作为参数来调用m方法。

当执行方法m(Object x)时,调用参数x的 toString 方法。x可能是GraduateStudent、Student、Person或者 Object的实例。类 Student、Person 以及 0bject都有它们自己对toString 方法的实现。使用哪个实现取决于运行时x的实际类型。

调用m(new Graduate-Student())(第 6行)会导致定义在 Student类中的 toString 方法被调用。 调用m(new Student() )(第7行)会调用在 Student类中定义的 toString方法。调用m(new PersonC()  )(第8行)会调用在 Person类中定义的 toString方法。调用m(new 0bject() )(第9行)会调用在0bject类中定义的 toString 方法。

匹配方法的签名和绑定方法的实现是两个不同的问题。引用变量的声明类型决定了编译时匹配哪个方法。在编译时,编译器会根据参数类型、参数个数和参数顺序找到匹配的方法。一个方法可能在沿着继承链的多个类中实现。Java 虚拟机在运行时动态绑定方法的实现,这是由变量的实际类型决定的。

三.对多态的理解

首先介绍一下向上转型:当父类引用指向一个子类对象时,便是向上转型。

如下图。

 ​​​​这里要注意的是:

  • 向上转型不要强制转型。
  • 父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。
  • 向上转型后父类引用不能调用子类自己的方法。

与向上转型对应的便是向下转型:

  • 父类类型向子类类型向下转换的过程(强制)。
  • 一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,就是向下转型。

多态性是指采用多种形式的能力,在Java中, 引用变量可以是多态的, 即它可以存放不同类对象的地址,只要这些类是它声明的类的派生类即可。当一个引用变量含有多态性时,Java执行的是动态绑定或者迟绑定。如果基类的方法被重写了,那么是对象的类型而不是引用变量的类型决定了哪个方法被调用。注意,我们不能把基类对象赋值给派生类的引用变量。

总结来说,多态就是基类型对象访问派生类重写的方法,它具有以下特点:

  • 循环调用基类对象,访问不同派生类方法
  • 实参是派生类,形参是基类

四.多态的必要条件及其优点

必要条件:

  • 继承
  • 重写
  • 父类引用指向子类对象

优点:

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

好啦,以上就是关于多态及其相关知识的介绍与理解,希望能给各位读者予以启发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值