《第6章《继承与多态》.pptx》由会员分享,可在线阅读,更多相关《第6章《继承与多态》.pptx(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第六六章章 继继承与多承与多态态 2清华大学出版社 Java程序设计(第2版)本章本章英文缩略词英文缩略词列列表表缩缩 略略 词词英文全称英文全称汉译名称汉译名称OOPObject Oriented Programming面向对象编程UMLUnified Modeling Language统一(或标准)建模语言OOADObject Orient Analysis Design面向对象的分析与设计 3清华大学出版社 Java程序设计(第2版)继承的概念继承的概念继承也称为派生,其概念来源于这样一种思想:同类事物具有共同性,在同类事物中,每个事物又具有其特殊性。运用抽象的原则舍弃对象的特殊性,抽
2、取其共性,便得到适应于一组对象的类,这便是一般类或通用类,而把具有特殊性的类称为特殊类或具体类。假定B类与C类具有A类的全部属性和方法,同时又分别具有自己特有的某些属性和方法,则把类A称作一般类,把类B与类C称作类A的特殊类 4清华大学出版社 Java程序设计(第2版)车类层次结构图车类层次结构图车类层次结构图为例,来演示继承关系:5清华大学出版社 Java程序设计(第2版)继承的实现继承的实现Java程序中,继承通过extends关键字来实现。子类对父类的继承是在类的声明中通过关键字extends来指明。实现继承的语法结构为:修饰符 class extends /类体定义 6清华大学出版社
3、Java程序设计(第2版)统一建模语言统一建模语言UMLUML统一建模语言(UML)是一个支持模型化和软件系统开发的图形化语言,是OOAD(面向对象的分析与设计)方法发展的产物和成果,已经发展成为当今通用的标准建模语言。UML通常以用例图、静态图、行为图、交互图和实现图这五类图形符号来描述建模对象,能够对任何具有静态结构和动态行为的系统进行建模 7清华大学出版社 Java程序设计(第2版)继承的示例继承的示例【例】实现两个类的描述:基类人(Person)及子类学生(Pupil)。人具有姓名(name)、年龄(age)、性别(sex)及配偶姓名(spouseName)四类属性,同时具有工作(wo
4、rk)、休息(rest)、娱乐(amusement)及处理家务(housework)四种行为方法。学生将从人这一父类中继承除配偶姓名以外的三类属性,并继承及除工作和处理家务以外的两类行为,同时要添加自身类特 有 的 几 类 属 性:所 属 学 校(school)、所 学 专 业(specialty)及所在年级(degree),同时还要增加几种学生的行为方法:学习(study)与考试(exam)8清华大学出版社 Java程序设计(第2版)UMLUML图表达类的继承关系图表达类的继承关系 9清华大学出版社 Java程序设计(第2版)构造方法的继承构造方法的继承构造方法是类中最为特殊的方法。子类能够
5、继承基类的非私有成员要素,而构造方法为公共类型,因此子类能够继承基类的构造方法。10清华大学出版社 Java程序设计(第2版)继承关系示例继承关系示例【例】点(Point)类描述了平面坐标系下的一个坐标点的属性与方法。由点类派生出两个子类:圆类(Circle)与矩形类(Rectangle)。圆类除了圆心坐标外,还具有半径(radius)属性;矩形类除左上角的坐标点外,还具有长度(width)与高度(height)属性。分别为每个类创建一些实例对象并输出其相关信息。用UML图表示Point、Circle与Rectangle类的继承关系 11清华大学出版社 Java程序设计(第2版)用用UMLUM
6、L图表示图表示 12清华大学出版社 Java程序设计(第2版)继承的特征继承的特征33343132继承关系是传递的继承简化了人们对事物的认识和描述,能清晰体现相关类之间的层次结构关系通过增强一致性来减少模块的接口和界面,大大增加程序的易维护性Java不支持类的多重继承,只支持类的单一继承 13清华大学出版社 Java程序设计(第2版)继承的意义继承的意义继承很好地解决了软件复用。通过继承,一个类可以拥有已有类的所有功能。因此,只需指明新类与现有类的不同,即增加自己的属性和方法即可,从而有效地减少了代码和数据的冗余度,增强了程序的可重用性。举例而言:假定B类继承了A类(即A类是B类的基类),建立
7、B类时只需增加与A类不同的特征(成员数据和成员方法)的描述,不需再重新定义A类已有的特征 14清华大学出版社 Java程序设计(第2版)JavaJava的多态的多态的多态的多态 多态性概念 方法重载(Overload)方法覆盖/重写(Override)方法重载与方法覆盖的比较 15清华大学出版社 Java程序设计(第2版)多态性多态性概念概念概念概念 多态性(Polymorphism)是指在基类中定义的属性或方法被派生类继承后,可以具有不同的数据类型,或表现出不同的行为,从而使得同一个属性或方法在基类及其各个派生类中具有不同的语义。Java的多态性体现在两个方面:方法重载实现的静态多态性,又称
8、为编译时多态 方法覆盖/重写实现的动态多态性,又称为运行时多态3132 16清华大学出版社 Java程序设计(第2版)继承机制下属性的多态行为继承机制下属性的多态行为继承机制下,类的成员要素的行为方式将会发生很大的变化。子类可以定义与基类相同的成员变量和成员方法,这种情况下,Java系统将面临如何解决成员要素定义的二义性冲突现象对于属性而言,子类在实现继承父类属性的同时,可以定义与父类属性相同名称与类型的自身属性,子类在执行自身方法时,默认情况下使用的是自身定义的属性,从而将父类的同名属性暂时屏蔽掉。这种原则称为属性隐藏 17清华大学出版社 Java程序设计(第2版)继承机制下方法的多态行为继
9、承机制下方法的多态行为同样,对于成员方法而言,子类在继承父类方法的同时,可以定义与父类原型相同而方法的具体实现不同的自身的成员方法,子类在自身方法中调用与父类同名的方法时,默认情况下调用的是自身定义的方法,从而相当于重新实现了父类的方法功能。这一原则称为方法覆盖。18清华大学出版社 Java程序设计(第2版)方法重载方法重载与方法覆盖与方法覆盖方法重载与方法覆盖是实现多态的两种形式一个类定义了多个名字相同而参数不同的成员方法或构造方法,称为方法的重载。方法重载包括构造方法的重载和成员方法的重载 19清华大学出版社 Java程序设计(第2版)方法重载方法重载(Overload)(Overload
10、)关于方法重载的使用要注意以下几点:333132调用重载方法时一定要给出正确的参数,系统根据给定的参数数目、类型、次序三个因素来决定到底调用哪个同名方法定义重载方法时,参数的个数、类型或排列顺序一定要有所区别方法返回类型的不同,不能用来区分同名方法,因不能做为方法重载的依据 20清华大学出版社 Java程序设计(第2版)方法覆盖方法覆盖/重写重写(Override)(Override)在子类中重新定义与父类同名的方法称为方法覆盖或方法重写。覆盖方法的调用原则:Java系统根据运行时所调用方法的对象类型,来决定调用哪个方法。若为子类的实例对象,如果子类覆盖了父类的方法,则运行时系统调用子类的方法
11、;如果子类继承了父类的方法而并未覆盖,则运行时系统调用父类的方法。21清华大学出版社 Java程序设计(第2版)方法重载与方法覆盖的比较方法重载与方法覆盖的比较方法重载与方法覆盖的比较方法重载与方法覆盖的比较 333132重载是名称相同但参数不同的多个方法在同一个类中的表现形式;覆盖则是在具有继承关系的不同类之间,子类重新定义来自父类方法的一种表现形式重载方法不能有相同的形参表;覆盖方法则必须有相同的方法名、形参列表和返回值重载方法调用时利用不同的实际参数进行同类方法的选择;覆盖方法调用时利用不同的前缀来选择不同类的方法 22清华大学出版社 Java程序设计(第2版)方法重载与方法覆盖的比较方
12、法重载与方法覆盖的比较方法重载与方法覆盖的比较方法重载与方法覆盖的比较 34方法重载只是提供了更多的选择,而不意味着替代;方法覆盖具有替代的意味,两个具有覆盖关系的方法被认为具有相同的语义 3536final方法可以被重载;但是不能被覆盖构造方法可以被重载;但是不能被覆盖 23清华大学出版社 Java程序设计(第2版)抽象类与抽象方法抽象类与抽象方法3132类与方法的抽象类与方法的抽象抽象类与抽象方法的应用抽象类与抽象方法的应用有关抽象类的说明抽象类的意义 有关抽象方法的说明抽象类 抽象方法 24清华大学出版社 Java程序设计(第2版)类与方法的抽象类与方法的抽象抽象类:就是不能使用new关
13、键字进行实例化的类,即没有具体实例对象的类。抽象类通常不具备实际功能,不能创建对象,只作为专门用来派生其他子类的基类。定义抽象类的目的是为子类提供公共信息与接口。抽象方法:是一种不完整的方法,它只包含有方法声明,而无方法体的定义,因而抽象方法是只有方法原型而无功能实现的一种行为规范,用来为所在类的子类声明方法的接口标准。25清华大学出版社 Java程序设计(第2版)有关抽象类的说明有关抽象类的说明有关抽象类的说明有关抽象类的说明当声明类被为抽象类时,需要在这个类前加修饰abstract抽象类通常包含若干个(可为零个)抽象方法;但不能在非抽象类中声明抽象方法抽象类不能创建对象,创建对象的工作由抽
14、象类派生的非抽象子类来实现33343132抽象类可以包含非抽象类所能包含的任何元素,这些要素包含具体的属性、非抽象方法以及多个重载的构造方法 26清华大学出版社 Java程序设计(第2版)有关抽象类的说明有关抽象类的说明有关抽象类的说明有关抽象类的说明(续续1 1)抽象类中不可包含抽象构造方法或抽象静态方法抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类若一个类中包含了至少一个抽象方法,则该类必须被声明为抽象类;但声明为抽象类的类不一定要包含抽象方法抽象类必须被子类继承,并由子类实现它的所有抽象方法没有所谓的最终抽象类,即抽象类不能再用final修饰类声明3536373839 27清华大学
15、出版社 Java程序设计(第2版)有关抽象类的说明有关抽象类的说明有关抽象类的说明有关抽象类的说明(续续2)2)不能创建abstract类的实例。然而可以创建一个引用型号变量,其类型为一个抽象类,并让它指向非抽象子类的一个实例抽象类中不能定义private类型的成员变量和成员方法若一个子类继承了一个抽象类,该子类没有实现抽象类中定义的每一个抽象方法,则该类仍然为抽象类,必须在它的类定义语句中加上abstract抽象修饰符。直到某个子类实现了它所有祖先类声明的抽象方法,该类才不再是抽象类,才能够生成实例对象310311312 28清华大学出版社 Java程序设计(第2版)抽象类的意义抽象类的意义
16、抽象类的意义抽象类的意义 3533343132抽象类实现自然界的抽象概念,体现数据抽象的思想,是实现程序多态性的一种手段抽象类是类层次中较高层次的概括,抽象类能让其子类继承它的抽象化的特征抽象类从更高级别上描述概念性的内容,抽象类中可以包括被其所有子类共享的公共属性与公共行为,有利于对所要解决问题的概念层次关系的组织与设计抽象类提供了可由其子类共享的一般形式,能够更好地统一用户接口抽象类是其所有子类公共属性的集合,可以充分利用这些公共属性来提高程序开发和维护的效率 29清华大学出版社 Java程序设计(第2版)抽象方法的说明抽象方法的说明抽象方法的说明抽象方法的说明抽象方法只需方法头的声明,无
17、需实现方法体absteact不能与private、static、final或native并列修饰同一个方法,即标明为private、static、final或native类型的方法不能再声明为抽象的如果一个类中含有抽象方法,则必须将这个类声明为抽象类所有的抽象方法,都必须定义于抽象类中。只有抽象类才能具有抽象方法33343132 30清华大学出版社 Java程序设计(第2版)有关抽象方法的说明有关抽象方法的说明有关抽象方法的说明有关抽象方法的说明(续续续续)一个抽象类的子类如果不是抽象类,则它必须实现抽象基类中的每一个抽象方法,即重写抽象基类中的所有抽象方法如果父类中已有同名的absteact
18、方法,则子类中就不能声明同名的抽象方法。抽象方法的真正实现由所在抽象类的不同子类在各自的类定义中完成。各子类将从抽象父类继承来的所有抽象方法进行重写,形成各自具有相同方法名,相同返回值类型,相同参数列表,目的一致但是具体实现有一定差别的方法抽象方法最后的分号不能省略,分号用来代替方法体的定义353637 31清华大学出版社 Java程序设计(第2版)抽象方法的意义抽象方法的意义抽象方法的意义抽象方法的意义 333132抽象方法能够隐藏具体的细节信息,使调用该方法的程序不必过分关注该类和它的各个子类的内部状况抽象方法为抽象类的子类规定了它们可用的标准行为与接口。抽象类的所有非抽象子类都必须完成父
19、类中声明的抽象方法抽象方法提供了实现一个接口,多种方法的机制,即所有的子类对外都呈现相同名字的方法接口 32清华大学出版社 Java程序设计(第2版)最终类与最终成员要素最终类与最终成员要素final修饰符能够用来修饰类及类的成员要素。final修饰的类称为最终类或终止继承类;final修饰的成员变量称为常量;final修饰的成员方法称为最终方法或禁止覆盖方法。33清华大学出版社 Java程序设计(第2版)最终成员要素最终成员要素333132final变量:用final修饰的成员变量将自动成为常量,这类常量只能被初始化一次,以后不再允许被改变,初始化过程一般是在定义时同时进行的 final方法
20、:被final修饰的方法能够被子类继承,但不允许被子类覆盖/重写,也不允许被子类扩展 final类:被final修饰的类成为最终类,这种类不能被继承,即可能派生子类 34清华大学出版社 Java程序设计(第2版)最终类与最终成员要素最终类与最终成员要素final修饰符能够用来修饰类及类的成员要素。final修饰的类称为最终类或终止继承类;final修饰的成员变量称为常量;final修饰的成员方法称为最终方法或禁止覆盖方法 35清华大学出版社 Java程序设计(第2版)接口接口接口的概念接口的概念接口的定义接口的定义接口类型与接口变量接口类型与接口变量接口的实现接口的实现 接口、类与抽象类接口、
21、类与抽象类 36清华大学出版社 Java程序设计(第2版)接口的接口的概念概念接口(Interface)是一种只包含常量与抽象方法的特殊的类,是Java语言用以实现类间多重继承功能的唯一手段。接口定义了一组特定功能的对外接口与规范,而并不真正实现这种功能,功能的实现留待给实现这一接口的各个类来完成 37清华大学出版社 Java程序设计(第2版)接口概念示例接口概念示例接口概念示例接口概念示例下面通过一个实际例子来说明接口的意义。下面通过一个实际例子来说明接口的意义。假定有三个类:假定有三个类:Academician,Professor,Housewife,分别代表大学生,分别代表大学生,教授和
22、家庭主妇三类群体,下面是他们一天的活动安排情况教授和家庭主妇三类群体,下面是他们一天的活动安排情况 38清华大学出版社 Java程序设计(第2版)接口的接口的接口的接口的UMLUML表达表达表达表达UML中,用带有三角箭头的虚线来表达类对接口的实现中,用带有三角箭头的虚线来表达类对接口的实现下面用下面用UML图表达实例中接口与各个类之间的实现关图表达实例中接口与各个类之间的实现关 39清华大学出版社 Java程序设计(第2版)接口的定义接口的定义接口的定义接口的定义定义接口要使用interface关键字。接口的定义包括接口头部声明与接口体定义两部分。接口定义的格式为:接口修饰符 interfa
23、ce extends /接口头部声明 /接口体定义/常量数据成员声明public static final =;40清华大学出版社 Java程序设计(第2版)接口的定义接口的定义接口的定义接口的定义(续)(续)public static final =;/抽象方法声明public abstract native ()throws;public abstract native ()throws;41清华大学出版社 Java程序设计(第2版)接口的实现接口的实现接口的实现接口的实现33343132实现接口的声明位置要在类定义的头部声明中,implements关键字表明一个类要实现的接口列表 一个类
24、可以实现一个接口,也可同时实现多个接口,对于包含多个接口的接口名列表,各接口名字之间用逗号分开实现接口的类可以使用接口中定义的所有常量 如果实现接口的类是抽象类,它可以不实现接口中定义的所有抽象方法 42清华大学出版社 Java程序设计(第2版)接口的实现接口的实现接口的实现接口的实现(续)(续)35363738如果实现接口的类不是抽象类,则在类体中必须实现接口的所有抽象方法,为所有抽象方法定义方法体类在实现接口的抽象方法时,必须使用完全一致的方法原型 接口的抽象方法的访问修饰符只能为public,这就决定了实现接口的类在实现接口方法时,必须显式地使用public修饰符,而不能使用其他限制更为
25、严格的访问修饰符(如protected等),否则将被系统警告为缩小了接口定义方法的访问控制范围子类可以直接继承使用接口基类中的各种方法,并能够超越(抑制)或重载它们 43清华大学出版社 Java程序设计(第2版)接口类型与接口变量接口类型与接口变量接口类型与接口变量接口类型与接口变量接口可以作为一种引用数据类型来使用,称这种引用数据类型为接口类型。可以定义接口类型的引用变量,这种使用接口名称作为类型的引用变量被称为接口变量。接口变量可以用作方法的形参,也可以作为全局变量或局部变量来使用。Java中,还可以声明接口类型的数组。Java中,允许用接口变量来引用实现接口的类对象或子类对象。44清华大
26、学出版社 Java程序设计(第2版)接口、类与抽象类接口、类与抽象类接口、类与抽象类接口、类与抽象类接口的特征与意义接口的特征与意义 接口的应用场合接口的应用场合 接口与类的区别与联系接口与类的区别与联系 表的补充说明表的补充说明 45清华大学出版社 Java程序设计(第2版)接口的特征与意义接口的特征与意义接口的特征与意义接口的特征与意义 多个类能够共享相同的接口,遵循相同的对外规范 每个类只需关注自己对接口方法的具体实现,而不需要知道其它类是如何实现接口方法的333132接口定义了一个抽象类的协议,揭示了一组对象的编程接口,而不揭示类的实际程序体,不关心接口的具体的实现 46清华大学出版社
27、 Java程序设计(第2版)接口的应用场合接口的应用场合接口的应用场合接口的应用场合 33343132接口捕获无关类之间的相似性,而不强迫类之间产生关系 通过接口指明多个类需要实现的方法集合的并集 通过接口了解对象的交互界面,而无需了解对象所对应的类Java只支持单一继承,在需要多重继承的情况时,通过接口来实现 47清华大学出版社 Java程序设计(第2版)接口与类的区别与联系接口与类的区别与联系接口与类的区别与联系接口与类的区别与联系 48清华大学出版社 Java程序设计(第2版)对上表的说明对上表的说明对上表的说明对上表的说明 333132接口的extends 子句与类的extends子句
28、基本相同,不同的是一个接口可有多个父接口,用逗号将它们隔开,而一个类最多只能有一个父类,但可以实现多个接口接口与一般类一样,本身也具有成员数据与成员方法,但成员数据为常量,且一定要赋初值,此值将不能再被更改接口是纯设计形式,不提供方法的实现,接口中不能包含任何可以执行的非抽象方法 49清华大学出版社 Java程序设计(第2版)包包 包的概念包的概念创建自定义包创建自定义包引用包引用包Java类库类库 50清华大学出版社 Java程序设计(第2版)包的概念包的概念包(package)是JAVA提供的管理类和接口的工具,是Java用来管理名称空间的一种机制。包是一组相关类和接口的集合。为了组织与使
29、用方便,通常将需要在一起工作的类和接口放在一个包中,而将没有协作关系的类和接口分装在不同的包中。这样既可以避免重名冲突,也能够限定包之间类的访问权限,利于更有效地管理众多的类和接口 51清华大学出版社 Java程序设计(第2版)包的概念说明包的概念说明3334313235包是类和接口的容器,它是一种松散的组织结构,包中的类和接口可以没有严格的关系,将它们组织在一起,仅仅是为了管理的方便 一个包对应一个文件夹。包是一种层次结构,包中还可以包含子包,类似于文件夹中还可以有子文件夹Java中的每一个类与接口都属于一个特定的包包是用来管理名称空间的,同一个包中的类名要唯一,不能重复;不同包中可以有相同
30、的类名创建包的语句和引入包的语句都要放在类的定义前面,这两类语句是必须出现在类定义体括号外面仅有的两种语句 52清华大学出版社 Java程序设计(第2版)创建自定义包创建自定义包包的定义通过关键字package来实现,定义的一般形式为:package ;语句说明:创建包就是在当前文件夹下创建一个子文件夹,以便存放这个包中含有的所有类代码每个JAVA源程序文件中最多只能有一条package语句,package语句必须为程序文件的第一条语句包名标识符一般采用小写字母表示,以便与类名有所区分333132 53清华大学出版社 Java程序设计(第2版)创建自定义包创建自定义包(续(续1 1)packa
31、ge语句缺省时,系统会自动为当前的文件创建一个默认的匿名包Java处理package语句的过程为:首先检查语句中指定的包(文件夹)是否已经存在;如果存在,则直接使用这一文件夹作为存放类文件的目录;如果不存在,则由系统创建该文件夹。JAVA程序编译后生成的类代码(即.class文件)都被存放在package语句指定的包中3435 54清华大学出版社 Java程序设计(第2版)创建自定义包创建自定义包(续(续2 2)创建不同等级的包:创建不同等级的包:可以用package关键字创建不同等级的包。不同等级的包对应于嵌套的多级目录结构。创建不同等级包的命令格式为:package.;55清华大学出版社
32、Java程序设计(第2版)引用包的策略引用包的策略333132类名前加上该类所在的完整包路径 在程序起始处用import语句引入所需要的包或包中的类,以后在程序中就可以直接使用该包中的类,而无需再用包名作前缀。这是一种一劳永逸的策略,也是大多数编程者采用的做法使用环境变量CLASSPATH设置所用的包的路径 56清华大学出版社 Java程序设计(第2版)JavaJava类库类库Java系统事先设计并实现了许多标准类与接口的集合,每一个类与接口都属于一个特定的包。编程者引用这些标准包中的类与接口,能够更方便、更快捷地开发Java程序。这些包被称为Java的API(应用程序接口)包,又称为Java
33、的类库。57清华大学出版社 Java程序设计(第2版)JavaJava类库类库Java 1.0只有十几个包,到了1.4版本,包的数量已经达到了一百多个。这些包中,常用的有java.lang、java.io、java.util、java.applet、java.awt、javax.swing等 包。java.lang包是Java的核心基础类库,是Java语言中最基本的包。该包包含有基本数据类型、数学函数、字符串等Java程序最基本的内容。java.lang包不需使用import语句导入便可使用,它是唯一一个由Java系统自动导入的类库。58清华大学出版社 Java程序设计(第2版)JavaJava中常见的包中常见的包 59清华大学出版社 Java程序设计(第2版)再再 见见