多态

本文详细介绍了面向对象编程中的两大核心概念:多态与抽象。解释了静态多态与动态多态的区别,以及如何利用向上转型和向下转型实现多态性。同时探讨了抽象类和抽象方法的应用及好处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态
相同的行为,不同的实现:多态
继承、封装、多态、抽象是面向对象编程的四大基本特征。
静态多态: 编译时,系统就能决定调用哪个方法
使用重载实现。
在编译期间,就能够确定方法是被哪一个对象所执行的重载或者重写,
是属于静态多态.
动态多态: 运行中系统才能动态确定方法所指的对象
使用动态绑定和重写实现

动态多态的技术基础
为什么父类的引用,可以指向子类的实现?
因为子类的实例中,一定拥有一个完整的父类的所有的值数据

引用数据类型,向下转型是有风险的,不是说就一定能转型成功,如果需要转型成功,
必须满足2个条件:
第一个,必须是父类的引用指向一个子类的实现
第二个,子类的引用最终必须指向相同类型的子类实现
(1)向上转型技术:一个父类的引用变量可以指向不同的子类对象,
或者说一个子对象可以被当作一个父类类型
引用数据类型的向上转型,是指子类向父类转型,
原因是:父类的范围>子类的范围
引用数据类型转型,只能发生在父子之间
(2)instanceof关键字: instanceof关键字用于判断运行时对象的真正类型。
(3)动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,
从而实现多态性。

向上转型和向下转型
转型条件,只能发生在夫子之间↓
当从低精度数据类型向高精度数据类型转换时实行自动转换,
这种类型转换技术称为向上转型;
当从高精度数据类型向低精度数据类型转换时,
需要使用强制类型转换符,这种类型转换技术称为向下转型。

(1)在父类和子类的继承层次关系中,由于子类能够继承父类的成员,并扩展出自己的成员。在继承树上,父类在上子类在下。因此:沿着子类向父类转换类型是向上转型,而从父类 向子类转换类型是向下转型。
(2)向上转型是可以自动完成的;向下转型是需要强制类型转换的。引用数据类型也是如此!

instanceof关键字
instanceof关键字的作用:判断某个对象,是否是某种类型的对象
instanceof的目的:规避掉在强制向下转型中,可能会出现的转型风险。
Java语言的多态机制导致了引用变量的声明类型和实际引用对象的类型可能不一
为更准确鉴别一个对象的真正类型, Java语言引入了 instanceof运算符。

动态绑定机制
(1)在面向对象程序开发中,我们将一个方法调用与该方法所在的类关联起来,称为“绑定” 绑定分静态绑定和动态绑定,。
(2)所谓动态绑定,是指在运行时根据具体对象的类型进行绑定。
Java中的方法只有final、static、private和构造器是前期绑定。
(3)当父类引用指向子类对象的时候,如果调用被子类重写的方法,那么表现得不是父类中的效果而是子类重写后的效果。

多态的主要应用——多态参数
(1)所谓多态参数,就是当方法的某个形式参数是一个引用的时候,与该引用兼容的任何对象都可以传递给方法,从而允许方法接受不同数据类型的形式参数。
(2)例如: equals ( )方法。
(3)如果方法中调用该对象的一个被重写的方法。那 “么不同类型的子类对象会表现出不同的体现。

多态的主要应用——异构集合
(1)多态另一个常见的应用是创建一个不是同一类型 ,
但是有共同父类的数据集合,不同对象的集合称为异构集合。

多态总结
(1)使用父类类型的引用指向子类的对象。
(2)该引用只能调用父类中定义的方法,不能调用子类中独有的方法。
(3)如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的
这个方法。
(4)在多态中,子类可以调用父 类中的所有方法。

抽象
(1)在编写类时,通常会在类中定义一些方法,用来描述该类所具有的行为。在类的方
法体中,我们编写代码实现该类所要执行的行为。
(2)在继承关系中,子类继承父类后,子类也就具有 , 父类所具备的行为。如果子类继
承了父类的行为 ,但是与父类的行为实现方式不同,就需要通过方法重写来覆盖父类的行为。,
(3)当抽象到一定的程度的时候,我们发现父类是没有必要进行实例化。
(4)口如何在语法上做到呢?
——abstract关键字
抽象类
(1)使用关键字abstract可以声明一个抽象类,该关键字可以出现在类声明时class关键字前的任何地方
(2)public abstract class Test{ }本类使用abstract修饰符修饰,表示该类不能创建实例,必须有子类来实现
(3)将父类声明为抽象后,仅有的改变是我们不能再实例化一个父类对象,其它的所有保持不变。
抽象类,是不能被实例化的类。
在抽象类中,类的所有其它功能都存在,成员变量、方法、构造器。
都可以用同样的方式访问。抽象类只是不能创建实例。
但是构造器此时的作用,并非是为了创建对象,而是用于分配成员变量的存储空间!

abstract在定义抽象方法的时候,
最大作用为:
(1)用来规范子类的行为,强制性的要求子类必须重写父类的方法实现
(2)但是抽象类中不一定必须要有抽象方法。

abstract:抽象
将一个方法声明为抽象方法有两个结果:
 类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象的。
 任何子类必须重写抽象方法,除非子类本身也是抽象的。
抽象类和抽象方法的好处
从设计的角度看,将一个抽象方法放在父类中,
可以强制任何子类实现一个特别的行为。
继承抽象方法的子类如果想要实例化对象,必须重写该方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值