第06章类的继承性

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Superclass Subclass Cylinder
-length +getRadius +setRadius +findArea +getLength +setLength +findVolume
父类和子类 关键字: super 方法覆盖 Object 类 修饰符: protected, final 和 abstract 多态性和动态绑定 接口 内部类 软件开发和类的设计原则
2
equals 方法 ♦ equals 方法检验两个对象是否相等,使用 equals 的语法如下: object1.equals(object2); 其中变量 object1 和 object2 属于同一个类。 ♦ 在 Object 类中使用 equals 方法等价于使用==运算符。比较运算符==用来比较两个 简单数据类型的值是否相等,或者判断两个对象是否具有相同的引用值。若 equals 方法在定义它的对象类中修改过,则可用来判断两个对象是否具有相同的内容。 toString 方法 ♦ 调用 object.toString(),将返回代表这个对象值的一个字符串。默认情况返回的 字符串由该对象所属的类名、@符号和代表该对象的一个数组成。 例如:System.out.println(myClinder); 输出类似 Cylinder@15037e5 的字符串,这些信息没有意义,因此应该在相应的类中覆 盖 Object 类中原有的 toString()方法。 ♦ 通常需改写 toString 方法,使它返回一个代表该对象的易懂的串。 clone 方法 ♦ 若要复制一个对象,要使用 clone()方法,语法如下: newObject = someObject.clone(); 这条语句将 someObject 复制到一个新的内存地址, 并让 newObject 的引用指向新对象。 ♦ 不是所有对象都可以被克隆。要成为一个可克隆的对象,它的类必须实现 java.lang.Cloneable 接口。 修饰符 protected 和 final ♦ 保护的修饰符 protected 应用于类的数据和方法上。公用类中保护的数据或方法可 以被同一包中的任何类或它的子类访问,即使子类在不同的包中也可以。 ♦ final 修饰符说明类是一个终极的类,不能做父类。 protected 修饰符可用来防止不同包的非子类访问本类的数据和方法
测试: (1)在 Circle 类中加入 package a,在 Cylinder 类中 import a.Circle,访问 radius 仍然 可以。 (2)在非 Circle 类的子类中访问 radius 编译出错。
3
final 修饰符 ♦ final 类不能被继承,比如 Math 类: final class Math {...} ♦ final 变量是一个常量: final static double PI = 3.14159; ♦ 父类的中 final 方法不能被子类所修改。 abstract 修饰符 ♦ abstract 类 – 不能用 new 运算符创建实例 – 必须在子类中被扩展和实现 ♦ abstract 方法 – 只有方法头标志而没有实现 课堂练习: abstract class Person { private String name; private int age; public String getName() { } public int getAge() { } public void setName(String name) { } public void setAge(int age) { } abstract public void printName(); abstract public void printAge(); } 1. 将抽象类 Person 补充完整。 2. 定义类 Student(非抽象类) ,是 Person 类的子类,类 Student 中有一个私有 String 类型的实例常量 CLASS(存储自己所在班级) ,有一个公有方法 printClass()方法,功 能是输出 CLASS 属性值。 3. 编写测试程序,首先创建一个 Student 对象,利用 setName()方法设置 name 属性(设成 自己的名字) ,然后输出自己的名字和学号,运行这个程序看输出结果。 多态性和动态绑定 ♦ 在 Java 中,可以在同一类或不同类中定义名称相同但操作不同的多个方法,多态性 指的是运行 时判断应该执行哪个方法代码的能力, 这种能力也叫做动态绑定。 例 6.3 测试多态性 目标:这个例子创建两个几个对象:一个圆和一个矩形 ,调用 equalsArea 方法来检验两个 对象的面积是否相等,并调用 displayGeometricObject 方法显示对象。 源程序:TestPolymorphism.java 对象转换 ♦ 总可以将一个子类的实例转换为一个父类的实例,所以显式的转换可以省略。 Circle myCircle = myCylinder 相当于: Circle myCircle = (Circle)myCylinder;
第 6 章:类的继承性 学习目标
♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ 引言 ♦ 在面向对象程序设计中,可以从已有的类派生出新类,这叫做继承。继承模拟 “是(is-a)”的关系。 继承的定义: 通过 extends 关键字指明新定义类的父类可以获取父类中所有非私有的 属性和方法。 ♦ 事实上,在 Java 中定义的每个类或者显式的、或者隐含的,都来自于一个已存 在的类。 父类和子类 ♦ 在 Java 术语中, 从另一个类 C2 派生的类 C1 称为次类 (子类、 扩展类或派生类) , C2 则称为超类 (父类或基类) 。 在子类中, 可以使用或改变在父类中定义的方法, 也可以创建新数据和新方法。子类通常比父类的功能更多。 ♦ 与通常意义不同,子类不是父类的子集。事实上,子类通常是扩展的,比父类 包含更多的功能和更详细的信息。
4
父类实例转换为子类实例 ♦ 把父类实例转换为子类实例时,必须使用转换记号进行明确的显式转换,向编译器 指明你的目的。为使转换成功,必须确保转换的对象是子类的一个实例。 Cylinder myCylinder = (Cylinder)myCircle; 父类对象和子类对象的转换原则: 1. 子类对象可以被视为其父类的一个对象。 例如:一个苹果是一个水果。 2. 父类对象不能被视为其某一个子类的对象。 例如:一个水果不一定是一个苹果。 3. 如果一个方法的形式参数定义的是父类对象,那么调用这个方法的时候可以使用子类对 象作为实际参数。 例如: 方法 displayGeometricObject(GeometricObject object), 形参是父类 GeometricObject, 调用时可以使用 Circle 类或 Cylinder 类的对象做为实参。 (例 6.3) 4. 如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类 型转换转化成子类对象的引用。 例如:Circle myCircle = myCylinder; Cylinder myCylinder = (Cylinder)myCircle; class Father { int m; } class Son extends Father { int x; } class UseSuperSub{ void useClass() { Father superObject,superRef; Son subObject,subRef; superObject = new Father(); subObject = new Son(); superRef = subObject; //子类对象作为父类一个对象 //subRef = superObject; //错误,父类对象不能视为起某一个子类的对象 subRef = (Son)superRef; //父类对象引用 superRef 实际指向的是子类对象,可以用强制类型转换转化成子类 对象的引用 useObject (subObject); //形式参数定义的是父类对象,那么调用这个方法的时候可以使用子类对象作为实 际参数 } void useObject(Father c) { } }
pacakge p1 class C1 protected int x pacakge p2 class C2 extends C1 x can be read or modified in C2
class C3 C1 c1; c1.x can be read or modified
class C4 C1 c1; c1.x cannot be read nor modified
1
使用关键字 super 关键字 super 指的是使用 super 的类的父类. 这个关键字可以用在下面两种方法中: super 代表当前对象的直接父类对象。也可以使用 super 访问父类中被子类的同名属性隐藏 了的属性,或访问父类中被子类的同名方法覆盖了的方法。 • 调用父类的构造方法 • 调用父类的方法 ♦ 调用父类的构造方法的语法: • super(); 调用父类的默认构造方法 • super(参数); 调用与参数匹配的父类构造方法 语句 super()和 super(参数)必须出现在构造方法的第一行,而且是调用父类构造方法的唯 一方式。 如果没有显式的式用关键字 super,总是调用父类的默认构造方法 super()。 如果父类定义了几种构造方法, 而没有默认构造方法, 子类就不能使用父类的默认构造方法, 因为在这种情况下父类没有默认构造方法。 在例 6.2 程序中测试这种说法。 ♦ 调用父类的方法的语法 关键字 super 也可以用来引用父类中构造方法之外的其他方法,语法如下: super.method(parameters); 方法覆盖 ♦ 有时,子类必须修改父类中定义的方法,这叫做方法覆盖。 ♦ 在子类中发生方法覆盖后,不能再直接访问父类中定义的同名方法,若要访问,必 须使用关键字 super。 注意: (1)方法的覆盖需要子类中的方法头和父类中的方法头完全相同,即应该有完全 相同的方法名、返回值类型和参数列表。注意和方法重载的区别。 (2)在子类中也可以重载父类中已有的方法,这时重载的方法应该具有相同的方法名 和不同的参数形式。 例 6.2 覆盖父类中的方法 Cylinder 类覆盖了在 Circle 类中定义的方法 findArea() 。 源程序:TestOverrideMethods.java 测试: (1)去掉 Cylinder 类中的默认构造方法中的 super()语句,没有影响。 (2) 去掉 Circle 类中的默认构造方法, 再编译 Cylinder.java 出错, 因为此时会在 Cylinder 的构造方法中默认调用 super(),而此时父类 Circle 中没有默认构造方法。 注意:访问父类中被子类覆盖了的 findArea()方法时,需要使用 super,对于父类中其他未 被子类覆盖的方法可以直接用方法名()的方式调用,比如 getRadius()。 Object 类 ♦ java.lang.Object 类是所有类的根。如果一个类在定义时没有指定继承谁,它的父 类就是 Object。 ♦ Object 中三个常用的实例方法是: • equals() 方法比较两个对象是否相等。 • toString() 方法将返回代表这个对象值的一个字符串。 • clone() 方法复制一个对象。
Superclass
Circle
Circle Methods
Circle Data
Circle -radius
Inheritance
Subclass
Cylinder
Circle Methods Cylinder Methods
Circle Data Cylinder Data
创建一个子类 ♦ 创建的新的子类将会继承父类中的属性和方法,此外我们还可以在子类中: • 添加新的属性(变量) Βιβλιοθήκη Baidu 添加新的方法 • 隐藏父类的属性和重载父类中的方法 属性的隐藏:子类对从父类继承来的属性变量重新加以定义。 方法的覆盖:子类重新定义与父类中相同的方法,则父类中的方法被覆盖 (Override) 。 例: 6.1 测试继承性 目标: 创建 Cylinder 对象并探索 Cylinder 和 Circle 类之间的关系。 源程序:TestCylinder.java
相关文档
最新文档