当前位置:文档之家› 第4章 类的继承和接口

第4章 类的继承和接口


30
max 方法
public class Max { // Return the maximum between two objects public static Comparable max (Comparable o1, Comparable o2) { if (pareTo(o2) > 0) return o1; else return o2; }
33
接口和抽象类(续)
Interface1_2 Interface2_2
Interface1_1
Interface1
Interface2_1
Object
Class1
Class2
interface Interface1 extends Interface1_1, Interface1_2 {}
class Class1 implements interface2_1,interface2_2
Java程序设计
第4章 类的继承和接口
夏海轮 xiahailun@
北京邮电大学 信息与通信工程学院
本章内容
类的继承 抽象类 类的多态性
接口
内部类 程序开发过程和类的设计原则
移动生活俱乐部(中国)
类的继承性
类的继承性 super关键字 方法覆盖(overriding) Object 类 修饰符protected,final和abstract 多态性和对象转换 接口 内部类 程序开发过程和类的设计原则
class C4 C1 c1; c1.x cannot be read nor modified
13
思考
子类在声明超类的public或者protected方法时, 如果使用了不同的参数列表,调用的时候会出现 什么情况?
14
final 修饰符
带有final 修饰符的类不能被继承 final class Math {...}
25
示例:转换对象
示例:创建两个几何几何,一个圆和一个圆 柱,调用displayGeometricObject方法来 显示对象。判断如果对象是一个圆,则调用 displayGeometricObject方法显示面积和 周长,若对象是圆柱,该方法显示表面积和 体积
26
本章内容
类的继承 抽象类 类的多态性
}
31
示例:使用接口
这个例子中运用 max 方法,在两个圆中找出最 大的圆,在两个圆柱中找出最大的圆柱
接口名和方法名用 斜体书写 虚线和虚线空三角 用来指向接口 GeometricObject Circle Cylinder
parable
ComparableCircle
34
Cloneable 接口
标记接口

标记接口不包含常量或方法,但它对Java系统 有特殊的意义。Java系统要求 类实现 Cloneable 接口,可复制类的对象
public interface Cloneable {
}
示例讲解
35
问题思考
不实现Cloneable接口会出现什么问题? 为什么要重写clone方法? 为什么调用super.clone()?
22
对象转换
子类的实例转换为它的父类的实例是可能的。这 是因为,明确的显示转换可以省略
– 例如:
Circle myCircle = myCylinder
– 等价于 Circle myCircle = (Circle)myCylinder;
23
父类转换子类
在父类向子类的转换时可能会用到明确的显示转 换。但是这种转换并不总是成功的
18
抽象类的应用
Circle GeometricObject
Circle Object GeometricObject
-color -weight +getColor +setColor +getWeight +setWeight +findArea +findPerimeter - radius +getRadius +setRadius
Cylinder
Cylinder
-length +getLength +setLength +findVolume
Rectangle
-width -length +getWidth +setWidth +getLength +setLength
Rectangle
在UML中,抽象类 名和抽象方法名用 斜题书写
Java类中每个类都直接或间接继承自Object类
每个Java类中都拥有Object类的方法
– toString()方法将返回代表这个对象值的一个字符 串 – equals()方法比较两个对象的内容是否相等
– clone()方法复制对象
– ……
11
protected 修饰符
protected修饰符可用于类的属性和方法
在一个普通的类中,clone()方法是不可以被外部类调用的, 因为在Object类中,clone()方法是一个protected类型的方法, 如果要在自己的类中提供clone()方法给外部调用,就必须重 写clone()方法,并将其访问限制修改为public,这样在外部 类中才可以调用该方法。但是修改为public后,在外部调用该 方法时会报一个CloneNotSupportedException的异常,除了重 写该方法外,新的类还需要实现Cloneable接口。
继承
子类
Cylinder
Circle Methods Cylinder Methods
Circle Data Cylinder Data
超类
子类
UML图示
Circle -radius
+getRadius +setRadius +findArea
Cylinder
-length +getLength +setLength +findVolume
ComparableCylinder
compareTo
32
接口和抽象类
接口中的数据必须是常量,抽象类可以有各种类 型的数据
接口中的每个方法,只有一个头标志,没有实现 部分;抽象类可以有具体的方法,每个抽象类必 须至少包含一个抽象方法或继承另一个抽象方法 由于在接口中定义的每个方法都是抽象方法,接 口中的方法不需要用abstract修饰;但是在抽象 类中抽象方法必须用abstract修饰
12
protected 修饰符(续)
package p1 class C1 protected int x package p2 class C2 extends C1 x can be read or modified in C2
class C3 C1 c1; c1.x can be read or modified
接口
内部类 程序开发过程和类的设计原则
移动生活俱乐部(中国)
接口(interface)
什么是接口?
–接口是一种与类相似的结构 –如果一个抽象类中所有的方法都是抽象的,我们可以 将这个类用另外一种方式来定义,也就是接口的定义 –接口只包含常量和抽象方法 –接口是一种特殊的抽象类,这种抽象类中只包含常量 和方法的定义,而没有变量和方法的实现 –一个接口可以继承自其它接口(可以多继承) –所有的类有一个共同的根--Object类,但接多态性
接口
内部类 程序开发过程和类的设计原则
移动生活俱乐部(中国)
多态性和动态绑定
多态性(polymorphism)即“多种形式”
–多态性是实现软件可重用性的手段之一。它使得继承 特性更为灵活,并使程序具有良好的可扩展性
静态多态性
–静态多态性在编译时就可以被系统识别,是指同名方 法在功能上的重载
5
继承
超类的private成员是不能被继承的 子类的方法不能访问超类的private成员 如果子类可以访问其超类的private成员,那么 该子类的所派生的类也可以访问这些数据,这样 扩展了本应是private数据的访问,同时将失去 信息隐藏的优点。
6
创建子类
从超类扩展属性和方法来创建子类,你可以:
17
abstract 修饰符
抽象方法必须用abstract来修饰;抽象类也必须 用abstract关键字来修饰 抽象方法
–只有方法的声明,不需要实现(没有方法体) –含有抽象方法的类必须被声明为抽象类
抽象类
–抽象类不能被实例化,即不能用new关键字去产生一 个类的对象 –抽象类的子类如果是一个非抽象类,那么该子类必须 覆盖父类中所有的抽象方法,否则这个子类还是抽象 类
8
关键字 super (续)
子类继承父类成员变量和成员方法,但不继承父 类的构造方法
– 在子类的构造方法中可以使用语句super(参数列表) 调用父类的构造方法
如果子类的构造方法中没有显式地调用超类的构 造方法,也没有使用this关键字调用重载的其它 构造方法,则在产生子类的实例对象时,系统默 认调用超类的无参构造方法 构造函数式是不能被继承的 任何子类构造函数的第一个任务就是隐式或者显 式调用直接超类的构造方法。

增加新的属性 增加新的方法 对超类中的属性和方法进行覆盖
示例:创建一个 Cylinder 类, 并且研究 Cylinder类 和 Circle 类之间的关系
7
关键字 super
关键字super是在引用超类中的子类中出现的
super关键字可以用于两种用途
– 调用超类的方法 – 调用超类的构造方法
9
方法覆盖(overriding)
方法覆盖:在子类中定义的一个方法,其名称、 返回类型及参数签名正好与父类中某 个方法的 名称、返回类型及参数签名相匹配 覆盖方法时不能使用比超类中被覆盖方法更严格 的访问权限
相关主题