第五章 类的继承和派生 Inheritance/extends/derive. 教学目标 理解继承的概念和作用 派生类的定义 理解访问修饰符 protected 方法的重写 继承下的构造函数的使用 继承下的 finalize 方法的使用 理解超类和子类的关系.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
第6章 对象和类.
第三讲 Java与面向对象技术 1、面向对象的概念 2、Java中的类、方法和变量 3、Java名字空间及访问规则
第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第 9 章 物件的建構.
项目6 通用堆栈.
Java程序设计教程 第一讲 Java概述.
第四章 继承与派生 Chapter 4 Inheritance and Derivation
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
第一章 面向对象程序设计.
第二章 JAVA语言基础.
類別與物件 Class & Object.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
JAVA程序设计 (03) JAVA Programming
1 Department of Computing.
第三章 控制结构.
再回首: Java关键字 数据类型:byte boolean char double float int long short ,
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Ch08 巢狀類別 物件導向程式設計(II).
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
第四章 在 C# 中实现 OOP 概念.
Interfaces and Packages
Java基础 JavaSE异常.
Classes Lecturer: 曾學文.
CHAPTER 9 建構方法 ROBERT.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
Java软件设计基础 5. 继承与多态.
面向对象程序设计 、.
Java程序设计 第9章 继承和多态.
類別的繼承 Vehicle Car.
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
C/C++/Java 哪些值不是头等程序对象
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Interfaces and Packages
第二章 Java语法基础.
辅导课程十一.
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
辅导课程十二.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

第五章 类的继承和派生 Inheritance/extends/derive

教学目标 理解继承的概念和作用 派生类的定义 理解访问修饰符 protected 方法的重写 继承下的构造函数的使用 继承下的 finalize 方法的使用 理解超类和子类的关系

5.1 继承的概念和软件的重用性 继承是从已有的类中派生出新的类。 新的类能吸收已有类的数据属性和行为 ; 并能扩展新的能力。 类和类之间的继承关系可以用 UML 符号表示如图 5-1, 父类又叫超类或基类, 子类又叫派生类。 父类是子类的一般化,子类是父类的特化(具体化)。 超类或基类 父类 子类 派生类 图 5-1 继承关系 super/base/parent child/derived

5.1 继承的概念和软件的重用性 如表 5-1 所示,列出了几个超类和子类的实际例子。 超类或基类 父类 子类 派生类 图 5-1 继承关系 超 类子 类 学生研究生、本科生、小学生 形状三角形、圆、矩形 雇员教师、医生、职员 交通工具轿车、卡车、公交车 水果苹果、梨、桃、桔 表 5-1 继承例子

“is-a” 关系 : 是类之间的继承关系。 子类的对象可当作超类对象。但反过来,不能把超 类对象可当作子类对象。 例如,轿车可看成是交通工具,但不能把交通工具 看成就是轿车。 “has-a” 关系 : 代表类之间的组合(参见 4.9 节)。 在 “has-a” 关系中一个对象包含一个或多个其他对 象的引用成员。 如,轿车由方向盘、轮子、发动机等组成。 5.1 继承的概念和软件的重用性(续)

继承分为单继承和多继承。 单继承是指一个子类最多只能有一个父类。 多继承是一个子类可有二个以上的父类。 由于多继承会带来二义性,在实际应用中应尽量 使用单继承。 Java 类只支持单继承,而接口支持多继承。 5.1 继承的概念和软件的重用性(续)

object Win DialogWin 单继承,in java Class 1 Class 4 Class 2 Class 3 多继承,in C++ 单继承与多继承例子

5.1 继承的概念和软件的重用性(续) 继承使软件的代码得到重用。 在继承关系中, 子类通过吸收已有类的数据(属性)和方法(行 为) 并增加新功能或修改已有功能来创建新类。 软件的重用性不仅节省了程序的开发时间,还促进了 经过验证和调试的高质量软件的重用,这增加实现系 统的效率。 在 java 中, Object 类定义和实现了 Java 系统所需要的众 多类的共同行为,它是所有类的根类,所有的类都是 由这个类继承、扩充而来的。

5.2 派生类的定义 派生类定义的一般格式为: [ 类修饰符 ] class 子类名 extends 父类名 { 成员变量定义; 成员方法定义; } 派生类的定义中,用关键字 extends 来明确指出 它所继承的超类。 例 5-1 通过继承来定义派生类 例 5-1

5.2 派生类的定义(续) class Automobile{ int Number; void setNumber(int Num){ Number=Num; } void showNumber(){ System.out.println("Automobile number:"+Number); } } 超类

5.2 派生类的定义(续) class Truck extends Automobile{ int capacity; void setCapacity(int truckCapacity){ capacity=truckCapacity; } void showCapacity(){ System.out.println ( "Truck Capacity:"+capacity ); } } 派生类

5.2 派生类的定义(续) class AutomobileExtends{ public static void main(String args[]){ Truck tc=new Truck(); tc.setNumber(8888); tc.setCapacity(10); tc.showNumber(); tc.showCapacity(); } } 该程序运行的结果为: Automobile number:8888 Truck Capacity:10 派生类使用从超类中继承 的方法 setNumber 派生类使用从超类中继承的方法 showNumber

5.3 作用域和继承 第 4 章讨论了成员访问控制修饰符: public 、 private 、 package 和 protected 。 超类 public 的成员可以在超类中使用,也可以在子类使用, 程序可以在任何地方访问 public 超类成员。 超类的 private 成员仅在超类中使用,在子类中不能被访问。 超类 protected 成员, 可在子类和同一包内其他类被访问。 超类 package 成员, 可在同一包内其他类被访问。 子类从超类中继承成员时,超类的所有 public 和 protected 成 员在子类中,都保持它们原有的访问修饰符。

5.4 方法的重新定义 (overriding) 如果在子类中定义的某个方法与父类的某个方法有相同 方法署名(方法头),则称子类重新定义( overriding )了 父类的该方法,或称重写或覆盖。 子类的对象调用这个方法时,将使用子类中定义的方法, 对它而言,父类中定义的方法就 “ 看不见 ” 了。 如要在子类的方法中要使用超类的这个被重写的方法, 用 : super. 超类同名方法 ( … ) 。 例 5-2 方法的重写 例 5-2

Point 类的设计: 成员变量 :int x , y 成员方法 : setX(int ) , getX() , setY(int) , getY() , toString() ; Point(), Point(int xValue,int yValue) Circle 类的设计: 成员变量 :x , y// 继承自 Point 类 radius 成员方法 : setX() , getX () , setY () , getY () // 继承自 Point 类 set Radius () , getRadius () , getDiameter () , getCircumference () toString() // 重写父类同名方法 getArea() Circle (), Circle ( int xValue, int yValue, double radiusValue )

5.4 方法的重新定义 (overriding) (续) Point.java 文件的部分代码: …… public String toString(){ return "[" + x + ", " + y + "]"; } …… Circle.java 文件的部分代码: …… public String toString(){ return "Center = " +super.toString()+" Radius = " + radius; } …… 重写了超类 Point 类中 的 toString 方法 通过 super 调用超类中的被重写的 toString 方法

5.5 继承下的构造函数和 finalize 方法 继承下的构造函数的调用次序:子类对象的实例化过程开 始于一系列的构造函数调用, 子类构造函数在执行自己的任务之前,将显式地(通过 super 引 用)或隐式地(调用超类的默认构造函数或无参数构造函数)调 用其直接超类的构造函数。类似地,如果超类派生于另一个类, 则要求超类的构造函数调用层次结构中上一级类的构造函数,依 此类推。在调用请求中,最先调用的构造函数总是 Object 类的构 造函数。最后才会执行原有的子类构造函数。 继承下的 finalize 方法的调用次序 类层次结构中子类 finalize 方法调用应先于超类的 finalize 方法, 直至最后调用 Object 超类的 finalize 方法。 finalize 方法的定义格式 : void finalize()

例 5-3 例 5-3 继承下的构造函数和 finalize 方法

5.6 超类和子类的关系(一) 再次使用点 — 圆继承层次来讨论超类与子 类的关系。 为了使圆类继承点类并能访问点类中的成 员变量,可将点类中的 x 和 y 定义成 protected 的成员. 例 5-4 中, Circle2 类通过继承 Point2 类,就 可以在 Circle2 类中访问它的超类( Point2 类) 的 protected 和 public 成员了。 例 5-4 例 5-4 使用 protected 数据的点 - 圆层次

5.6 超类和子类的关系(二) 但在使用 protected 成员变量时,会产生两个问题 : 子类可将非法值赋给变量,导致该变量处于非法状态。 例如,如果将 Circle2 的成员变量 radius 声明为 protected , 则它的子类就能够将负值赋给 radius 变量。 编写的子类 Circle2 方法更依赖于超类 Point2 实现。 例如,如果由于某种原因将成员变量 x 和 y 的名称改为 xCoordinate 和 yCoordinate ,则子类直接引用这些超类成员变 量的所有地方都必须进行相应地修改。 为了使子类应依赖于超类服务,而不应依赖于超类实现 : 把超类中的成员变量声明为 private ,并在超类中定义访问 这些 private 成员变量的 public 型的方法,

例 5-5 把超类中的成员变量声明为 private , 在子类中使用从超类中继承过来的方法对这些 私有成员变量进行访问。

//Point3.java public class Point2 { private int x; private int y; …… public void setX( int xValue ){ x = xValue; } public int getX(){ return x; } public void setY( int yValue ){ y = yValue; } public int getY(){ return y; } …… }

//Circle3.java public class Circle3 extends Point3 { private double radius; public Circle3(){ // 隐式调用超类的无参构造方法 } public Circle3( int xValue, int yValue, double radiusValue ){ super( xValue, yValue ); // 显式调用超类的构造方法 setRadius( radiusValue ); } public String toString(){ // 调用超类的 toString 方法 return "Center = " + super.toString() + "; Radius = " + getRadius(); }

5.7 继承的程序设计举例(一) 下面让我们来看一个具有 3 级继承 层次的例子。这 3 级为点 — 圆 — 圆柱 体。它们之间的继承关系如图 5-3 所 示。 例 5-6 例 5-6 继承的程序设计举例 图 5-3 三级继承层次

Point 类的设计: 成员变量 :int x , y 成员方法 :setX , getX , setY , getY , toString. Point(), Point(int xValue,int yValue) Circle 类的设计: 成员变量 : double radius 成员方法 : setRadius , getRadius , getDiameter , getCircumference , getArea,toString Circle( ), Circle(int xValue,int yValue, double radiusValue ) Clinder 类的设计 : 成员变量 : double hight 成员方法 : setHight , getHight , getArea, toString Cylinder( int xValue, int yValue, double radiusValue,double heightValue )

小结 继承作用 : 在原有类的基础上派生出高效的子类。 子类可以使用超类中被声明为 protected 和 public 的成员, 也可以在子类中重写超类中的方法,使该方法的执行 更符合子类的情况。 超类的构造函数不能够被继承,但当调用子类的构造 函数时,将首先要隐式或显式地调用超类的构造函数。 如果类层次结构中的类声明了它们自己的 finalize 方法, 则子类方法 finalize 的最后一个操作应调用超类的 finalize 方法,以确保在垃圾收集器回收对象内存时, 能够正确的结束对象的所有部分。

[ 作业与实验 ] 作业 书 P96: 1 、 2 、 8 、 9 、 10 、 11. 实验 习题解答与实验书 P83 : 实验 8