第6章 继承与多态
将上转型对象转换为子类对象称为下转型对象。
6.3 对象的赋值兼容规则 当用一个父类对象表示子类对象后,父类对象: 可以访问子类继承自父类的域或被子类隐藏的域; 可以调用子类继承自父类的方法或被子类重写的方法; 不能访问子类相对于父类新增加的域或方法。 所以,通过父类访问的域或方法一定是继承自父类的域或方法、或者是 隐藏继承自父类的域、或者是重写继承自父类的方法。 使用赋值兼容规则主要是为了实现多态性。
第
6
章
继 承 与 多 态
Java程序设计
人民邮电出版社
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.1.1 子类定义 子类定义实际上就是定义类的过程,只不过是在父类的基础上定义。子 类定义形式:
【例6.4】某公司给雇员发工资。雇员中 有经理、技术人员和一般雇员,该公司 给雇员定的工资标准是:一般雇员工资 领固定工资,经理工资在一般雇员工资 基础上加本月津贴,技术人员的工资在 一般雇员工资基础上加技术津贴,技术
出与父类不同的行为。这种重新定
义的过程称方法的重写
(Override)。
津贴为工作小时数×单位津贴/小时。
abstract class 类名 { //…… }
抽象类不能生成对象实例。
6.6.2 abstract修饰方法 关键字abstract修饰的方法称为抽象方法。抽象方法定义的形式:
[访问限定词] abstract 数据类型 方法名([参数表列]); 抽象方法只有方法的头部,没有方法体。抽象方法一定不能用关键字
final class 类名 { //…… }
最终类不能派生子类。定义最终类的目的是不希望父类中的域被子类隐
藏、方法被子类重写,可以对类起到保护作用。典型的最终类就是String类。
6.4.2 final修饰方法
final修饰的方法称为最终方法。修饰的形式:
[访问限定词] [static] final 方法类型 方法名([参数]) { //…… }
class 子类名 extends 父类名 {//子类类体 //…… }
Java语言只支持单重继承。除了Object类之外每个类都有一个父类,它
是所有类的直接父类或间接父类。
如果在定义一个类时没有说明该继承自哪一个类,则该类的父类是Object。
6.1.2 子类的可访问性
01
OPTION
父类的私有成员可以被子类继承,但只能通过继承自父类的并且子类可以访 问的方法间接访问。 类中的公有成员可以被子类中的方法直接访问,在子类类体外可以通过子类 对象访问。
Example6_04.java
6.2.3 super关键字 super表示当前类的直接父类。 在有些情况下,还想访问被子类隐藏的域或被重写的方法,这种情况下 则可以通过关键字super实现相应的访问。
如果想明确地访问继承自父类中的域,可以通过下面形式访问:
super.域名
表示访问当前类直接父类中的域。如果想明确地调用继承自父类中的 方法,可以通过下面形式访问:
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.5.1 多态概念
同一类对象表现出的不同行为称为多态。
多态的实现一定得在有继承关系的对象中。每一个子类的对象的行 为都与其它子类对象或父类对象的行为不同,这种行为上的不同称为多 态性。 程序设计语言本身必须支持多态性,编程时才能够实现多态性。
02
OPTION
03
OPTION
父类与子类在同一个包中,则父类中的保护成员可以被子类中的方法直接访 问,在子类类体外可以通过子类对象访问。
父类与子类不在同一个包中,则父类中的保护成员可以被子类中的方法直接 访问,但在子类类体外不可以通过子类对象访问。
04
OPTION
6.1.2 子类的可访问性
01
OPTION
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
小结
Summary
通过继承,可以实现代码重用,提高编程效率,提高程序运行的稳定 性。继承是实现多态性的前提。 继承过程中,子类可以定义与父类同名的域,则在子类中隐藏了父类 的域;子类还可以将继承自父类的方法重写。在子类对象中,如果想访问父 类中被隐藏的域或调用父类中被重写的方法,可以用关键字super。 父类对象可以表示子类对象,称为类型兼容规则。 多态性指的是同一类对象具有的不同行为,具有指的是有共同父类的 子类对象的不同行为。 如果父类没有必要创建实例,则可以声明为抽象类。如果不希望一个 类有子类,则可以将该类声明为最终类。
父类与子类在同一个包中,则父类中的友好成员可以被子类中的方法直接访 问,在子类类体外可以通过子类对象访问。
02
OPTION
父类与子类不在同一个包中,则父类中的友好成员不可以被子类中的方法直 接访问,在子类类体外不可以通过子类对象访问,只能通过继承自父类的并 且子类可以访问的方法间接访问。
【例6.1】设计一个圆类,该类能够表示圆的位置和大小,能够计算圆的面
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.3 对象的赋值兼容规则 在有继承关系的类中,可以用父类对象表示子类的对象,称为赋值兼容 规则。例如,类B是类A的子类,则下面的赋值是正确的: A a=new B(); 当用父类对象表示子类对象时,父类对象称为子类对象的上转型对象。 当一个父类对象表示的是子类对象时,还可以将该父类对象强制转换成 子类对象。如: B b=(B)a;
谢
谢
观
赏
Java程序设计
人民邮电出版社
更多样书申请和资源下载需求,请登录人邮教育社区 ()
海量图书方便查询 囊括各大品类,您想要的应 有尽有 免费申请样书 教师免费申请样书, 我们将安排快递迅速送达 下载配套资源 教学视频、PPT课件、教学 案例、习题答案、模拟试卷 等丰富资源免费下载 优惠购书
【例6.2】instanceof的用法。
Example6_02.java
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.2.1 域的隐藏
子类根据需要可以将继承自父类的方法重新定义以适合子类对象的需
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.4.1 final修饰类 关键字final可以修饰类,可以修饰方法,还可以修饰域。 final修饰的类称为最终类。修饰的形式:
6.2.3 super关键字
如果父类和子类中都定义了实例初始化器,则构造子类对象时,调用顺
序为“父类的实例初始化器→父类的构造方法→子类的实例初始化器→子类
的构造方法”。
【例6.5】平面上有若干条线段,已知每条线段两个端点的坐标。设计线段
类并创建线段类的对象表示线段。要求用继承的方法实现。 Example6_05.java
积和周长,能够对圆进行平移。定义圆类的对象并进行相应的操作,输出操
作后的结果。Example6_01.java
6.1.3 instanceof运算符
instanceof运算符用于判断一个对象是否是某一个类的实例对象,或者 是否是某一个类的子类的实例对象。 instanceof的方法形式:
对象名 instanceof 类名
【例6.6】有多种交通工具,利用多态性表现出每种交通工具的正
确运行状态。 Example6_06.java
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.6.1 abstract修饰类 关键字abstract可以修饰类,也可以修饰类中的方法。 关键字abstract修饰的类称为抽象类。抽象类定义的形式:
final修饰。 抽象类中可以有非抽象(实例)方法,也可以有抽象方法。如果一个 类中有抽象方法,该类必须定义成抽象类。
【例6.7】有若干个圆和矩形,已知每个圆的半径和矩形的长、宽,计算这些圆 和矩形的面积和周长。
Example6_07.java
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
要,这种情况称为方法的重写。
子类中定义的域的名字与继承自父类的域的名字相同,则在子类中隐
ቤተ መጻሕፍቲ ባይዱ
藏了继承自父类的域,子类中的方法不能访问父类中的被隐藏的域。
【例6.3】域隐藏举例。
Example6_03.java
6.2.2 方法的重写
当子类继承父类的方法后,子 类根据自身的需要可以对继承的方 法重新定义,以便使子类对象表现
super.方法名([实际参数])
super还可以用于调用直接父类的构造方法:
super([实际参数]);
6.2.3 super关键字 调用父类的构造方法有如下的规则: 在构造子类对象时,父类的构造方法一定会被调用; 如果子类的构造方法使用了super调用父类的构造方法,则按给定的参数 调用父类中相应的构造方法; 如果在子类的构造方法中没有使用super调用父类的构造方法,则父类中 的没有参数的构造方法会被自动调用。 如果子类没有使用super调用父类构造方法并且父类中也没有定义没有参 数的构造方法,则编译不能通过。