多态
继承、封装、多态、抽象是面向对象编程的四大基本特征。封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提条件下,改变类的内部结构,同时保护了数据。继承是为了重用父类代码,同时为多态做准备。那么,什么是多态呢?
所谓多态,英文单词为polymorphism,这个英文单词是由单词poly(意思是很多或多个)和morph(意思是形状或形式)组成的复合词。多态一词最早出现在生物学,是指生物学的一个基本原则:一个生物或物种可以有多种不同的形式或阶段。面向对象编程吸收了这一原则,在OOP中,多态是指一个对象有多种形式的能力。一个类的子类可以定义它们唯一的行为,同时共享父类的某些相同特征。
多态可以说是面向对象编程的精髓所在。因此,理解多态的含义,对理解面向对象编程有特别重要的意义。
Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同。C++允许多继承,这确实给它带来了非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦。为了规避风险,Java只允许单继承,子类与父类间有IS-A的关系。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制。所以,Java引入了多态性的概念,以弥补这点的不足。此外,我们在本节后面要学到的抽象类和接口也是解决单继承规定限制的重要手段。
在Java中,多态有两种理解方式:第一种是对象的不同的方法可以用相同的一个方法名,也就是重载的概念。 另一种是同一对象根据不同的消息执行相应的行为,也可以这样认为发送消息给某一个对象,让对象自行选择哪种相应的行为。根据这种两种方式,所以多态可以分为静态多态和动态多态。
静态多态指的是程序在编译时,系统就能决定调用哪个方法,所以也称为编译时多态。在Java中,静态多态实现的方式就是方法重载,其调用规则是依据对象在定义时的类型相应地调用对应类中的重载方法。
动态多态指在运行中系统才能动态确定方法所指的对象,所以也称为运行时多态。动态多态的实现方式是重写父类中的同名成员方法,其调用规则是依据对象在实例化时而非定义时的类型,相应地调用对应类中的同名成员方法。也就是说,动态多态主要通过动态绑定和重写的机制来实现。
多态的技术基础
在Java中,使用动态绑定和重写机制来实现多态,我们首先需要掌握如下三个基础技术概念:
- 向上转型技术:一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当作一个父类类型。
- instanceof关键字:instanceof关键字用于判断运行时对象的真正类型。
- 动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。
向上转型和向下转型
基础数据类型中数值数据类型byte、short、int、long、float和double的相互转换规则,即:当从低精度数据类型向高精度数据类型转换时实行自动转换,这种类型转换技术称为向上转型;当从高精度数据类型向低精度数据类型转换时,需要使用强制类型转换符,这种类型转换技术称为向下转型。
对于引用数据类型,这种转换技术依然适用。在父类和子类的继承层次关系中,沿着子类向父类向上转型是自动转换,而从父类向子类必须使用强制类型转换才能实现向下转型。
使用instanceof关键字判断对象的真正类型
Java语言的多态机制导致了引用变量的声明类型和实际引用对象的类型可能不一致。为更准确鉴别一个对象的真正类型,Java语言引入了instanceof运算符。
多态的主要应用
多态参数
所谓多态参数,就是当方法的某个形式参数是一个引用的时候,与该引用兼容的任何对象都可以传递给方法,从而允许方法接受不同数据类型的形式参数。
异构集合
多态最常见的应用是创建一个不是同一类型,但是有共同父类的数据集合。不同对象的集合称为异构集合
多态总结
- 使用父类类型的引用指向子类的对象。
- 该引用只能调用父类中定义的方法,不能调用子类中独有的方法。
- 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法。
- 在多态中,子类可以调用父类中的所有方法。
抽象
我们在编写类时,通常会在类中定义一些方法,用来描述该类所具有的行为。在类的方法体中,我们编写代码实现该类所要执行的行为。在继承关系中,子类继承父类后,子类也就具有父类所具备的行为。如果子类继承了父类的行为,但是与父类的行为实现方式不同,就需要通过方法重写来覆盖父类的行为。
抽象类
在Java中,使用关键字abstract可以声明一个抽象类,该关键字可以出现在类声明时class关键字前的任何地方。
抽象方法
如果我们想一个类包含一个特定的方法,该方法的实际实现由子类决定,那么我们就可以在父类中将该方法声明为抽象方法。抽象方法只有方法签名,没有方法体。
将一个方法声明为抽象方法有两个结果:
- 类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象的。
- 任何子类必须重写抽象方法,除非子类本身也是抽象的。
本文深入探讨了面向对象编程中的多态概念,解释了多态的两种形式:静态多态和动态多态,并介绍了Java中实现多态的技术基础,如向上转型、instanceof关键字和动态绑定技术。

1567

被折叠的 条评论
为什么被折叠?



