前言
面向对象形成设计的三大支柱是封装、继承和多态。本节内容将介绍多态。
一、什么是多态?
-
多态(polymorphism),源于希腊文字,意思是“多种形式”。Java中的多态是指基类对象访问派生类重写的方法,通俗来说,就是使用父类对象的地方都可以使用子类的对象。多态是一种循环调用基类对象,访问不同派生类的方法,它的实参是派生类,形参是基类。继承是多态实现的基础。
-
子类型和父类型。一个类实际上定义了一种类型。子类定义的类型称为子类型(subtype), 而父类定义的类型称为父类型(supertype)。
-
多态有两种形式:
- 引用的多态
- 方法的多态:覆盖、重载
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
二、多态性(Polymorphism)
- 多态性是采用多种形式的能力。在 Java 中,引用变量可以是多态的,即它可以存放不同类对象的地址,只要这些类是它声明的类的派生类即可。 我们可以用 exam 变量存放一个 FinalExam 对象的地址。 这条语句创建了一个 FinalExam 对象,并且把对象的地址存放在 exam 变量中。
Gradedactivaity exam = new FinalExam(50.7);
- 基类型的引用变量指向派生类。
- 如果基类的方法被重写了,那么调用哪个方法是由对象的类型决定,而不是引用变量的类型来定义。
- 不能把基类对象赋值给派生类的引用变量。
三、多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
四、多态存在的必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
注意:方法的重写和重载是不同的。重栽意味着使用同样的名字但是不同的签名来定义多个方法。重写意味着在子类中提供一个对方法的新的实现。
五、多态的实例
- 继承关系使一个子类继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来就不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。
实例 1 :
方法 displayObject (第 12 行〉具有 GeometricObject 类型的参数。可以通过传递任何一个 GeometricObject 的实例(例如:在第 5-8 行的 new CircleFromSimpleCeometricObject(1,“red”.false)和 new RectangleFromSimpleGeometricObject(1,1,“black”,false))来调用 displayObject。
public class PolymorphismDemo {
/** Main method */
public static void main(String口 args){