《JAVA程序设计教程》电子教案 第5章 继承

上传人:E**** 文档编号:89401067 上传时间:2019-05-24 格式:PPT 页数:51 大小:268KB
返回 下载 相关 举报
《JAVA程序设计教程》电子教案 第5章  继承_第1页
第1页 / 共51页
《JAVA程序设计教程》电子教案 第5章  继承_第2页
第2页 / 共51页
《JAVA程序设计教程》电子教案 第5章  继承_第3页
第3页 / 共51页
《JAVA程序设计教程》电子教案 第5章  继承_第4页
第4页 / 共51页
《JAVA程序设计教程》电子教案 第5章  继承_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《《JAVA程序设计教程》电子教案 第5章 继承》由会员分享,可在线阅读,更多相关《《JAVA程序设计教程》电子教案 第5章 继承(51页珍藏版)》请在金锄头文库上搜索。

1、学习导读 本章讨论面向对象的编程(OOP)及其关键技术:继承和多态、接口、包。 继承性是软件复用的一种形式,对降低软件复杂性行之有效。继承性同时是面向对象程序设计语言的特点,采用对象但没有继承性的语言是基于对象的语言,但不是面向对象的语言,这是两者的区别。 多态性允许以统一的风格处理已存在的变量及相关的类,使增加系统中新功能变得容易。,第5章 继承,教学重点与难点 理解继承和复用的概念 理解父类和子类 掌握扩展类编程 理解多态性是如何扩充和维护系统性能 掌握如何建立包和接口,第5章 继承,第5章 继承,5.1 继承的概念 5.2 扩展类 5.3 多态与动态绑定 5.4 构造函数的继承与重载 5

2、.5 包 5.6 接口 5.7 本章小结 5.8 思考与练习,5. 1 继承的概念,继承性是面向对象程序设计语言的最主要的特点,是其他语言(如面向过程语言)所没有的。,类之间的继承关系是现实世界中遗传关系的直接模拟,它表示类之间的内在联系以及对属性和操作的共享,即子类可以沿用父类(被继承类)的某些特征。当然,子类也可以具有自己独立的属性和操作。,继承,例如,飞行器、汽车和 轮船可归于交通工具类, 飞行器类可以继承交通 工具类某些属性和操作。,除遗传关系外,现实世界中还普遍存在着部分整体关系。例如,飞机可由发动机、机身、机械控制系统、电子控制系统等构成。聚集关系。,5.1.1 继承定义,继承性是

3、软件复用的一种形式。新类由已存在的类生成,通过保留它们的属性和行为,并且根据新类的要求对性能加以修改,添加新的属性和行为。 如果子类只从一个父类继承,则称为单继承;如果子类从一个以上父类继承,则称为多继承。注意 Java不支持多重继承,但它支持“接口”概念。接口使Java获得了多重继承的许多优点,摒弃了相应的缺点。,父类名跟在extends 关键字后面,用来说明当前类是哪个已经存在类的子类,存在继承关系。,定义 雇员类 Employee 的两个子类: 一般雇员类:CommonEmployee 主 管 类:ManagerEmployee,子类从父类继承有两个主要的方面: (1)属性的继承。例如,

4、公司是一个父类,一个公司有名称、地址、经理、雇员等,这些都属于结构方面。 (2)方法的继承。一个父类定义了若干操作,如一个公司要有项目、利润、任命经理、录用职工等操作,子公司也将继承这些行为。,5.2.1 继承关系定义,5. 2 扩展类,class CommonEmployee extends Employee 子类1: int m_ManagerNo ;定义类属性m _ManagerNo,代表雇员上司的编号 class ManagerEmployee extends Employee 子类2: int m_SecretaryNo; 定义类属性m_SecretaryNo,代表秘书的编号 ,两个

5、子类,声明类头-父类名,5.2.2 属性继承与隐藏,尽管Employee类是一个父类,但是并不因为它是父类就意味着它有更多的功能。恰恰相反,子类比它们的父类具有更多的功能。因为子类是父类的扩展,增加了父类没有的属性和方法。,(1)子类不能访问父类的private成员,但子类可以访问其父类的public, (2)protected访问是public和private访问之间一个保护性的中间层次。 (3)由于被继承的父类成员没有在子类声明中列出,但是这些成员确实存在于子类中。,5.2.2 属性继承与隐藏,Manger类增添了一个新的字段用于存储奖金,并且增添了一个新方法用于设置它的值: class

6、Manager extends Employee public void setBonus(double b) bonus=b; private double bonus; ,5.2.3 方法继承、覆盖与重载,对于Manager对象,可以使用getName和getHireDay等方法。即使这些方法没有明显地在Manager类中定义,它们也自动地从Employee类中继承过来了。 2方法覆盖 方法的覆盖是指:子类定义同名方法来覆盖父类的方法,是多态技术的一个实现。当父类方法在子类中被覆盖时,通常是子类版本调用父类版本,并做一些附加的工作。,1方法继承,关于覆盖应注意的事项:,(1)不使用supe

7、r而希望引用父类方法会导致无限的递归,因为子类方法实际上是在调用它自己。 (2)当通过父类引用调用一个方法时,Java会正确地选择与那个对象对应的类的覆盖方法。 (3)方法覆盖中,子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即与父类完全相同的方法名、返回值和参数列表。 (4)子类可以添加字段,也可以添加方法或者覆盖父类中的方法。然而,继承不能去除父类中的任何字段和方法。,3方法重载,重载的定义:可以用相同的方法名但不同的参数表来定义方法(参数表中参数的数量、类型或次序有差异),这称为方法重载。,重载(overloading):当多个方法具有相同的名字而含有不同的参数时,便

8、发生重载。编译器必须挑选处调用哪个方法。它通过将在不同方法头部中的参数类型和在特定的方法调用中使用值的类型进行比较,从而挑选出正确的方法。,5.2.4 在子类中使用构造函数,关于子类构造函数的规律总结如下: (1)子类构造函数总是先调用(显式的或隐式地)其父类的构造函数,以创建和初始化子类的父类成员。 (2)构造函数不能继承,它们只属于定义它们的类。如果把一个对象指定为其父类的引用,那么允许把这个对象转换回它自己原来的类型,为了向该对象传送一些在父类中没有的信息,必须这样做。 (3)当创建一个子类对象时,子类构造函数首先调用父类的构造函数并执行,接着才执行子类构造函数。,5.2.5 父类对象与

9、子类对象的关系,调用过程:e. getSalary() 程序会选择正确的getSalary方法。注意尽管e的声明类型是Employee. 当e指向一个Employee对象时,e.getSalary()会调用Employee类中的getSalary方法;而当e指向一个Manager对象时,getSalary()方法就变成了Manager类的getSalary()方法。虚拟机知道e所指对象的实际类型,因此它会调用正确的方法。 事实上,一个对象变量(如e)可以指向多种实际类型这种现象称为“多态”。在运行时自动选择正确的方法进行调用称作动态绑定。,5.2.6 扩展类继承的应用示范,现在讨论一个继承性的

10、具体例子5-2,点、圆的层次结构。首先建立并使用Point类,然后从point类继承产生Circle类。 程序的模块: (1)模块1:程序定义了一个Point类; (2)模块2:又定义了Circle类,它是从Point类继承来的; (3)应用程序,该程序演示了如何把子类引用指定为父类引用,以及把父类引用强制转换为子类引用,注意当p添加到string时对toString的隐式调用。,用来完成这个效果的两项关键编程技术是: (1)创建Circle类继承了Point类。 (2)在Point类和Circle类中用完全相同的signature覆盖toString方法。 值得强调的是以下几点: (1)Ja

11、va将隐式地把Object类(java.lang包)作为新定义类的父类。Object类提供了一套任何类的任何对象均可使用的方法。 (2)子类构造函数总是先调用(显式的或隐式地)其父类的构造函数,以创建和初始化子类的父类成员;构造函数不能继承,它们只属于定义它们的类。(3)父类的实例变量可用Protected限定,因此,从Point衍生Circle类时,Circle类的方法能直接引用坐标x和y,而不必使用访问。,5.3 多态与动态绑定,多态(Polymorphism)提高了程序可扩充性,调用多态性行为的软件传送给对象的消息(即方法调用)与对象的类型无关,因此能响应已有消息的新类型可以直接加入系统

12、,而不用修改基本系统。 在运行时自动选择正确的方法进行调用称作动态绑定(dynamic binding)。,5.3.1 多态,对于数据来说,继承是否为正确的设计可以用一个简单的规则来判断。“is-a”规则表明子类的每一个对象都是一个超类的对象。例如,每一个经理是一个员工。然而,只有经理类是员工类的子类才是有意义的。很明显,反过来就不行了并不是每个员工都是经理。 还有一个明确叙述“is-a”规则的方法是替代原则。该原则规定无论何时,如果程序需要一个超类对象,都可以用一个子类对象来代替。,5.3.2 动态绑定,理解调用一个对象方法的机制是非常重要的。下面具体介绍: (1)编译器检查对象的声明类型和

13、方法名。 (2)接着,编译器检查方法调用中的参数类型。如果在所有的叫做f的方法中有一个其参数类型同调用提供的参数类型最匹配,那么该方法就会被选择调用。这个过程称作超载选择。 (3)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。,动态绑定是非常重要的特性:它能使程序变得可扩展而无需重编译已存代码。,5.3.3父类对象与子类对象的使用与转化,this表示的是当前对象本身,更准确地说,this代表了当前对象的一个引用。对象的引用可以理解为对象的另一个名字,通过引用可以顺利地访问对象,包括修改对象的属性、调用对象的方法。,1this,现介绍程

14、序里父类对象与子类对象间的指代使用和转化。this和super是常用来指代父类对象与子类对象的关键字.,super表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。所谓直接父类是相对于当前对象的其他“祖先”而言的。,2super,提供一个构造函数: public Manager(String n,double s,int year,int month,int day) super(n,s,year,month,day); bonus=0; 这里关键字super具有不同的意义。代码: super(n,s,year,month,day); 的意思是“调用Employee父类的构造函数

15、,同时带有n、s、year、month以及day参数”。,5.3.3父类对象与子类对象的使用与转化,父类对象与和子类对象的转化需要注意如下的原则: (1)子类对象可以被视为是其父类的一个对象; (2)父类对象不能当成是其某一个子类的对象; (3)如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为形式参数; (4)如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。,5.3.4 多态性在工资系统中的应用,下面给出了一个根据员工类型利用抽象方法和多态性完成工资单计算的程序。Employee是抽象(abstract)父

16、类,Employee的子类有经理Boss,每星期发给他固定工资,而不计工作时间;普通雇员CommissionWorker,除基本工资外还根据销售额发放浮动工资;对计件工人PieceWorker,按其生产的产品数发放工资;对计时工人HourlyWorker,根据工作时间长短发放工资。该例的Employee的每个子类都声明为final,因为不需要再由它们生成子类。,对程序的几点说明: (1)对所有员工类型都使用earnings方法,但是每个人挣的工资按他所属的员工类计算,所有员工的类都是从父类Employee继承出的。 (2)如果一个子类是从一个具有abstract方法的父类继承的,子类也是一个abstract类并且必须被显式声明为abstract类。 (3)一个abstract类可以有实例数据和非abstract方法,而且它们遵循一般的子类继承规则。 (4)现在分析一下Employee类,其中public方法包括:构造函数,以及一个abstract方法earnings

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号