第8章继承和多态

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例8-4:演示程序中多态性的使用。
8.3 抽象类
抽象是面向对象技术解决问题的基本手段。 在类的继承层次中,沿着层次向下,各个子类变得 越来越具体和专用;而沿着层次向上,类就变得越 抽象和通用。有时父类会设计的非常抽象,以至于 它没有具体的实例,这样的类称为抽象类。
8.3 抽象类
Java语言中使用关键字abstract修饰抽象类,抽象类 的定义语法如下:
8.1.6 对象类Object
(1)equals方法 equals方法的作用是比较两个对象内容是否相等, 其调用形式为:
对象1.equals(对象2);
equals方法在Object类中的原始定义如下:
public boolean equals(Object obj) { return (this == obj); }
8.1.5 对象类型转换与instanceof运算符
除基本数据类型可以进行类型转换外,Java语言也 允许对象引用变量进行类型转换,转换规则如下:
(1)自动类型转换
引用类型的自动类型转换也称为隐式类型转换或向上 类型转换。在继承关系中,父类的引用变量可以直接引用 其任一子类的对象。 (2)强制类型转换 引用类型的强制类型转换也称为显式类型转换或向下 类型转换。在继承关系中,子类的引用变量可以通过强制 类型转换引用父类对象;或接受父类引用变量的赋值。
8.3 抽象类
Java语言使用抽象类时应该注意以下几个问题:
(1)任何包含抽象方法的类必须用abstract修饰,否则会



出现语法错误。 (2)抽象类有构造方法,但不能创建对象。其构造方法 是为子类调用准备的。 (3)抽象类定义的引用变量可以引用其任何子类的对象 。 (4)抽象类的具体子类应该覆盖父类的所有抽象方法。 没有被覆盖的抽象方法在子类中仍然是抽象的,此时子类 是抽象子类。子类中覆盖父类的抽象方法通常称为实现该 抽象方法。 (5)static、private和final不能用于修饰抽象方法。
8.1.6 对象类Object
Java语言所有的类都直接或间接地继承自 java.lang.Object类,它是包括数组在内的所有类的 公共祖先。Object类是Java语言继承体系的根,是 唯一没有父类的类。 当一个类在定义时没有使用extends关键字指明它的 父类时,默认的父类是Object类。
[其他修饰符] abstract class 抽象类名 { …… }
抽象类可以包括普通的成员方法,但通常一个抽象 类应至少包含一个抽象方法。 抽象方法是使用abstarct修饰的没有定义方法体的方 法,其格式如下:
[其他修饰符] abstract 返回类型 抽象方法名(形参列表);
例8-5:定义几何形状类用于计算面积和输出,为它 们设计一个抽象父类。
8.1.1 使用继承
Java语言使用关键字extends表示父类与子类之间的 继承关系,语法形式如下: class 子类名 extends 父类名 { //子类体 }
8.1.1 使用继承
面向对象程序设计中根据子类可以继承父类的数量分为多继 承和单继承两种,Java语言只支持单继承,即一个子类只能 继承一个父类。 子类是基于父类创建的,它可以继承父类的部分数据域和方 法,在访问修饰符的作用下,子类对父类数据域和方法的继 承受到以下一些限制。
//调用父类的无参构造方法 super(参数); //调用父类的有参构造方法
super();
Java语言规定,构造方法的第一条语句必须通过 super调用父类的构造方法,或者通过this调用本类 的另外一个构造方法。如果编写构造方法时没有显 示地写出这两条语句之一,则编译器会自动将 super()作为构造方法的第一条语句 。
8.1.5 对象类型转换与instanceof运算符
Java语言提供instanceof运算符来检查一个对象的类 型。其语法格式如下:
对象引用变量 instanceof 类名 对象 instanceof 类名
在进行对象引用的强制类型转换之前,应该使用 instanceof检查对象的类是否与目标类匹配。
8.1.2 创建子类对象
Java语言中,创建子类的对象时,将会沿着继承层 次自下而上依次调用所有父类的构造方法,称为“ 构造方法调用链”。 例8-2:演示构造方法调用链。 关键字super不仅可以在子类构造方法中调用父类构 造方法,还可以用来调用父类的方法中调用父类的 其他方法,其使用形式如下:
第8章 继承和多态
学习目标
本章将学习面向对象程序设计的继承和多态。使用 继承可以在已有类的基础上构造新类,是类重用的 体现。多态在继承的基础上实现,可以使提高程序 的灵活性和可扩展性。
2
Java程序设计
8.1 继承
类之间的继承关系是现实世界客观事物之间分类关 系的直接模拟,如飞机、汽车和火车均属于交通工 具,这三个类可以继承交通工具类的属性和方法, 并扩展自己特有的属性和方法。 面向对象程序设计术语中,若类B继承类A,则类A 称为父类,类B称为子类。父类也可以叫作超类、基 类,子类也可以叫作派生类。
public interface Comparable { public int compareTo(Object o); //接口中可以省略abstract 修饰符 }
8.2 多态
实现多态性需要3个要求:
(1)程序中必须通过继承形成类的层次关系。 (2)响应消息的方法必须在类的层次关系中多次定义。即
该方法应该首先在父类中定义,然后在子类中进行覆盖。 (3)发送多态消息的语句必须使用父类的引用变量来引用 对象。调用方法时,根据对象的实际类型而不是引用变量 类型决定调用哪一个方法。
8.2 多态
Java语言的消息驱动机制中,发送消息是指一个对象 调用另一个对象的方法;响应消息是指被调用的方法 的执行和返回过程。 面向对象程序中不同类的对象接收到同一消息时,可 能产生完全不同地响应结果,该现象称为多态性。 Java语言中,多态性是指调用不同类的对象中相同签 名的方法时,将执行不同代码段。
8.1.6 对象类Object
Object类中定义了如下2个protected方法和9个public方法, 这些方法被Java语言的所有类所继承。
protected void finalize() protected Object clone() public final Class getClass() public int hashCode() public boolean equals(Object obj)
super.方法名(参数);
8.1.3 方法覆盖
子类可以从父类继承实例方法,但是某些情况下父 类的方法在子类中并不适用,此时必须在子类中保 留方法头不变,对方法体进行修改,称为方法覆盖 (override)。 Java语言对方法覆盖进行了如下规定:
(1)方法覆盖只能对子类继承父类的实例方法进行。 (2)子类覆盖父类方法时,必须保持方法的签名不变,
8.1.6 对象类Object
(2)hashCode方法 hashCode方法的功能是产生一个将对象存储到 哈希表(Hash Table)时所需要的哈希码,返回值 是整数类型。 如果两个对象用equals判定为不相等,对应的 hashCode方法值也不应该相同。一般覆盖了equals 方法也需要同时覆盖hashCode方法。
(1)使用final修饰类可以禁止类被继承。例如类MyClass
不能被其它类继承。 public final class MyClass { …… } (2)使用final修饰方法可以禁止父类的方法被子类覆盖。 例如方法aMethod可以被子类继承但不能被覆盖。 public final void aMethod() { …… }
8.4 接口
使用接口的主要目的是统一公共常量、规范公共的 操作接口的管理。如果希望某个类能够符合某个接 口定义的方法规范,则需要让这个类实现相应的接 口。 Java语言中类实现接口的语法形式如下:
[修饰符] class 类名 [extends 父类名] [implements 接口1, …, 接口n] { …… }
8.1.1 使用继承
例8-1:在第7章的矩形类Rectangle4的基础上扩展 一个名为Cuboid1长方体类。子类中增加表示长度的 数据域length和计算体积的方法getVolume。 UML类图的继承关系:
8.1.2 创建子类对象
Java语言规定子类不能继承父类的构造方法,但是 必须在子类的构造方法中调用父类的构造方法。 关键字super可以用来调用父类的构造方法,其使用 方式如下:
8.4 接口
Java语言的接口(interface)是一种与类相似的结构 ,只包含常量和抽象方法。常量定义使用public static final修饰;抽象方法使用public abstract修饰。 接口没有构造方法,不能创建对象。 Java语言接口的语法格式:
[访问修饰符] interface 接口名{ //常量成员,使用public static final修饰 //方法成员,使用public abstract 修饰 }
(1)子类与父类在同一包的情况。子类可以继承父类中除private成员
以外的所有成员,继承来的成员的可访问性保持不变。 (2)子类与父类不在同一包的情况。子类可以继承父类中public和 protected修饰的成员,继承来的成员的可访问性保持不变。 (3)任何情况下子类不能继承父类的private成员,但可以通过继承到 的方法进行间接访问。
即:返回值类型、方法名、形式参数列表均不变。 (3)子类覆盖父类方法时,方法的访问修饰符范围必须 大于等于父类中方法的访问修饰符。
例8-3:在类Cuboid1的基础上进行改进,重命名为 Cuboid2。改进内容包括:增加构造方法和覆盖 getArea方法。
8.1.4 关键字final
final关键字在继承中可以起到如下作用:
public String toString()
public final void notify() public final void notifyAll() public final void wait(long timeout) public final void wait(long timeout, int nanos) public final void wait()
8.1.6 对象类Object
(3)toString方法 toString方法返回一个描述对象的字符串。 Object类中定义的toString方法返回的字符串类似 “shape.Cuboid2@8c5b9fb7”的形式,大多数类应 该根据自身实际情况覆盖toString方法。
8.2 多态
继承是面向对象技术另外一个重要特征——多态性 的基础。利用多态可以提高软件系统的灵活性、可 理解性和可扩展性。 面向对象程序设计的一个重要概念是“消息驱动” 。 消息是指一个对象请求另一个对象协助完成某项任 务的规格说明,消息中应当包括接收方的信息及具 体请求的操作说明。 当一个对象向另一个对象发送消息时,接收到消息 的对象会给予响应,使原本处于静态的对象被激活 ,这个过程称为消息驱动。
8.4 接口
一个Java类可以同时实现多个接口。 类实现接口时,它会继承接口中所有的静态常量和 抽象方法。如果类没有实现接口中的所有抽象方法 ,则该类是抽象类。 接口可以用来定义引用变量,该变量可以引用任何 实现了该接口的类的对象。
1. Comparable接口的使用
ຫໍສະໝຸດ Baiduomparable接口是Java类库中定义的一个接口,用 于规范Java程序中进行对象的大小比较操作时的格 式。 该接口的源码如下:
相关文档
最新文档