




已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章消息、继承、封装与多态,世界是由各种各样的对象组成,对象之间的相互作用形成了这个丰富多彩的世界。在面向对象的系统中,对象之间的相互作用是通过一个对象向另一个对象发送消息的方式体现的。多个对象之间通过传递消息来请求或提供服务,从而使一个软件具有更强大的功能。封装是指类的设计者只是为类的使用者提供类的可以访问的部分(包括类的数据成员和成员方法),,而把类中的其他成员隐藏起来,用户不能访问。继承是面向对象程序设计的一个重要特征,它是通过一个类派生子类来实现的,这种结构对充分利用已有的类来创建更复杂的类,实现代码的复用具有重要意义。多态是面向对象的程序中同名不同方法共存的现象,引入多态机制可以提高类的抽象度和封闭性,统一类的对外接口。通过本章的学习,读者将深入了解类的这些特性。,本章主要内容,5.1消息5.2继承5.3抽象类、接口和包5.4封装5.5多态,5.1消息,在面向对象的系统中,对象间的相互作用是通过一个对象向另一个对象发送消息的方式来体现的。消息就是数据成员和成员方法的引用。,消息的概念消息就是向对象发出服务请求,是对数据成员和成员方法的引用。消息的性质:(1)同一对象可接收不同形式的多个消息,产生不同的响应。,(2)相同形式的消息可以发送给不同对象,所做出的响应可以是截然不同的。(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会,对消息的响应并不是必须的。,公有消息和私有消息对象之间的消息传递称为公有消息;而对象内部数据成员或成员方法之间的调用称为私有消息。【例5.1】公有消息和私有消息示例。,5.2继承,继承是面向对象程序设计的又一种重要手段,在面向对象程序设计中,采用继承机制可以有效地组织程序结构,设计系统中的类,明确类之间的关系,充分利用已有的类来创建更复杂的类,大大提高程序开发的效率,提高代码的复用率,降低维护的工作量。,继承的概念继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。继承避免了对一般类和特殊类之间共同特征进行的重复描述,运用继承原则使得系统模型比较简练也比较清晰。,父类与子类之间的关系如图所示:,继承的特征(1)继承关系是传递的。(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。(3)提供软件复用功能。(4)通过增强一致性来减少模块间的接口和界面,大大增加程序的易维护性。(5)提供多继承机制。,继承的实现在Java程序设计中,继承是通过extends关键字来实现的。在定义类时使用extends关键字指明新定义类的父类,新定义的类称为指定父类的子类,就在两个类之间建立了继承关系。这个新定义的子类可以从父类那里继承所有非private的属性和方法作为自己的成员。实际上,在定义一个类而不给出extends关键字及父类名时,默认这个类是系统类Object的子类。,1数据成员的继承:子类可以继承父类的所有非私有的数据成员。【例5.2】数据成员继承示例。2数据成员的隐藏:在子类中重新定义一个与父类中已定义的数据成员名完全相同的数据成员,即子类拥有了两个相同名字的数据成员,一个是继承父类的,另一个是自己定义的。,当子类引用这个同名的数据成员时,默认操作是引用它自己定义的数据成员,而把从父类那里继承来的数据成员“隐藏”起来。当子类要操作继承自父类的同名数据成员时,可使用关键字super引导。【例5.3】数据成员隐藏示例。,3成员方法的继承:子类可以继承父类的非私有成员方法。【例5.4】成员方法继承示例。4成员方法的覆盖:子类可以重新定义与父类同名的成员方法,实现对父类方法的覆盖。方法的覆盖与数据成员的隐藏的不同之处在于:,子类隐藏父类的数据成员只是使之不可见,父类同名的数据成员在子类对象中仍然占有自己独立的内存空间;而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。【例5.5】成员方法覆盖示例。,this与super1this的使用场合。在一些容易混淆的场合,例如,成员方法的形参名与数据成员名相同,或者成员方法的局部变量名与数据成员名相同时,在方法内借助this来明确表示引用的是类的数据成员,而不是形参或局部变量,从而提高程序的可读性。,简单地说,this代表了当前对象的一个引用,可将其理解为对象的另一个名字,通过这个名字可以顺利地访问对象、修改对象的数据成员、调用对象的方法。归纳起来,this的使用场合有下述3种:,(1)用来访问当前对象的数据成员,其使用形式如下:this.数据成员(2)用来访问当前对象的成员方法,其使用形式如下:this.成员方法(参数)(3)当有重载的构造方法时,用来引用同类的其他构造方法,其使用形式如下:this(参数),【例5.6】this使用示例。【例5.7】使用this示例。2super的使用场合。super表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。super的使用方法有3种:,(1)用来访问直接父类隐藏的数据成员,其使用形式如下:super.数据成员(2)用来调用直接父类中被覆盖的成员方法,其使用形式如下:super.成员方法(参数)(3)用来调用直接父类的构造方法,其使用形式如下:super(参数)【例5.8】super使用示例。,5.3抽象类、接口和包,抽象类体现数据抽象的思想,是实现程序多态性的一种手段。接口则是Java中实现多重继承的唯一途径。包是一个更大的程序单位,主要实现软件复用。,抽象类假设要编写一个计算圆、三角形和矩形面积与周长的程序,若按前面所学的方式编程,必须定义4个类:圆类、三角形类、矩形类和使用前3个类的公共类,它们之间没有继承关系。程序写好后虽然能执行,但从程序的整体结构上看,3个类之间的许多共同属性和操作在程序中没有很好地利用,,如图所示,致使重复编写代码,降低了程序的开发效率,且使出现错误的机会增加。,分析上面例子中的3个类,可以看到这3个类都要计算面积与周长,虽然公式不同但目标相同。因此,可以为这3个类抽象出1个父类,在父类里定义圆、三角形和矩形3个类共同的数据成员及成员方法,把计算面积与周长的成员方法名放在父类给予说明,而具体的计算公式再在子类中实现。,这样,通过父类就大概知道子类所要完成的任务,而且,这些方法还可以应用于求解平行四边形、梯形等图形的周长与面积,如图5-4所示。这种结构就是抽象类的概念。,抽象类刻画了公有行为的特征,并通过继承机制传送给它的派生类。在抽象类中定义的方法称为抽象方法,这些方法只有方法头的声明,而用一个分号来代替方法体的定义,即只定义成员方法的接口形式,而没有具体操作,只有派生类对抽象成员方法的重定义才能真正实现与该派生类相关的操作。,在各子类继承了父类的抽象方法之后,再分别用不同的语句和方法体来重新定义它,形成若干个名字相同、返回值相同、参数列表相同、目的一致但是具体实现有一定差别的方法。抽象类中定义抽象方法的目的是实现一个接口,多种方法的原理,即所有的子类对外都呈现一个相同名字的方法。,抽象类是它的所有子类公共属性的集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。对于抽象类与抽象方法的限制如下:(1)凡是用abstract修饰符修饰的类被称为抽象类。凡是用abstract修饰符修饰的成员方法被称为抽象方法。,(2)抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法。(3)抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。(4)对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码。(5)抽象类可以派生子类,在抽象类派生的非抽象子类中必须实现抽象类中定义的所有抽象方法。,(6)抽象类不能创建对象,创建对象的工作由抽象类派生的非抽象子类来实现。(7)如果父类中已有同名的abstract方法,则子类中就不能再有同名的抽象方法。(8)abstract不能与final并列修饰同一个类。(9)abstract不能与private、static、final或native并列修饰同一个方法。(10)abstract类中不能有private的数据成员或成员方法。,【例5.9】抽象类应用。注意:在上例中,只能在C5_9类中main方法中定义3个子类的对象,使它们称为main方法的局部对象,而不能将它们定义在main方法之外,因为非static方法是不能在static方法中被引用的,而方法中的局部变量不能带修饰符,它们不受此限制。,接口多重继承是指一个子类可以有多个直接父类,该子类可以全部或部分继承所有直接父类的数据成员及成员方法。在面向对象的程序设计语言中,有些语言(如C+)提供了多继承机制。而Java出于安全性、简化程序结构的考虑,不支持类间的多继承而只支持单继承。,然而在解决实际问题的过程中,在很多情况下仅仅依靠单继承不能将复杂的问题描述清楚。为了Java程序的类间层次结构更加合理,更符合实际问题的本质要求,Java语言提供接口来实现多重继承机制。,1声明接口,格式如下:修饰符interface接口名extends父接口名列表常量数据成员声明抽象方法声明常量数据成员前可以有也可没有修饰符,其默认的修饰符是publicfinalstatic。,接口中方法默认的修饰符为publicabstract。从上面的格式可以看出,定义接口与定义类非常相似。实际上完全可以把接口理解成为一种特殊的类,接口是由常量和抽象方法组成的特殊类。一个类只能有一个父类,但是它可以同时实现若干个接口。,这种情况下,如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。接口定义仅仅是实现某一特定功能的一组功能的对外接口和规范,而不能真正地实现这个功能,,这个功能的真正实现是在“继承”这个接口的各个类中完成的,要由这些类来具体定义接口中各抽象方法的方法体。因而在Java中,通常把对接口功能的“继承”称为“实现”。2定义接口注意事项(1)接口定义用关键字interface,而不是用class。,(2)接口中定义的数据成员全是publicfinalstatic成员,即常量。(3)接口中没有自身的构造方法,所有成员方法都是publicabstract方法,即抽象方法。(4)接口也具有继承性,可以通过extends关键字声明该接口的父接口。,一个类要实现接口时,即一个类要调用多个接口时,要注意以下几点。:(1)在类中,用implements关键字就可以调用接口。一个类可以调用多个接口,这时,在implements后用逗号隔开多个接口的名称。,(2)如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。(3)如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。,但是对于这个抽象类任何一个非抽象的子类而言,它们父类所实现的接口中的所有抽象方法以及自身所实现接口中的抽象方法都必须有实在的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。,(4)接口的抽象方法的访问限制符都已指定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。【例5.10】将例5.9改写为接口程序。【例5.11】将例5.10改写为既有继承类又有接口的程序。,包在Java程序中,如果要想使一个类在多个场合下反复使用,可以把它存放在一个称之为“包”的程序组织单位中。可以说,包是接口和类的集合,或者说包是接口和类的容器。,包的作用有两个,一是划分类名空间,二是控制类之间的访问。这就需要注意下述两点:(1)因为包是一个类名空间,所以,同一个包中的类(包括接口)不能重名,不同包中的类可以重名。,(2)类之间的访问控制是通过类修饰符来实现的,若类声明修饰符public,则表明该类不仅可供同一包中的类访问,也可以被其他包中的类访问;若类声明无修饰符,则表明该类仅供同一包中的类访问。1Java程序的构成在一般情况下Java源程序的构成由4部分组成。,(1)一个包(package)说明语句(可选项)。其作用是将本源文件中的接口和类纳入指定包。源文件中若有包说明语句,必须是第一个语句。(2)若干个import语句(可选项)。其作用是引入本源文件中所需要使用的包。(3)一个public的类声明。在一个源文件中只能有一个public类。(4)若干个属于本包的类声明(可选项)。,2创建包包的创建就是将源程序文件中的接口和类纳入指定的包。包的声明语句格式如下:package包名;例如,下面的语句是合法的创建包的语句:packagep1;packagep1.p2;,若源文件中未使用package,则该源文件中的接口和类位于Java的无名包中(无名包又称缺省包),它们之间可以相互引用非private的数据成员或成员方法。无名包中的类不能被其他包中的类所引用和复用。【例5.12】改写例5.11,将接口与类纳入包。,3包的引用将类组织成包的目的是为了更好地利用包中的类。通常一个类只能引用与它在同一个包中的类。如果需要使用其他包中的public类,则可以使用如下的几种方法。(1)在引入的类前加包名,例如:p1.Circlec=newp1.Circle(25,25,5,3);,(2)用import关键字加载需要使用的类,例如:importp1.Circle;(3)用import关键字加载整个包,例如:importp1.*;,5.4封装,封装也称信息隐藏,是指类的设计者只为类的使用者提供类的可以访问的部分(包括类的数据成员和成员方法),而把类中的其他成员隐藏起来,使用户不能访问的机制。这种机制为程序的编制和系统的维护提供了方便,设计者不必知道程序实现的细节,而只要知道类可以访问的部分即可,排除错误更为方便。,封装包含以下几个方面的含义。(1)在类的定义中设置类的访问权限及其成员的访问权限。(2)提供统一供其他类引用的方法。(3)其他对象不能直接修改本对象所拥有的属性和方法。,Java提供了4种访问权限来实现封装机制,即public、protected、private和friendly,每种访问控制符的访问权限见表5-1。,表5-1类、数据成员和成员方法的访问控制符及其作用,公共访问控制符public当一个类被声明为public时,只要在其他包的程序中使用import语句引入这个public类,就可以访问和引用这个类,创建这个类的对象、访问这个类内部可见的数据成员和引用它的可见的方法。表明这个类作为整体对其他类是可见和可使用的,这个类就具有了被其他包中的类访问的可能性。,但是,处于不同包中的public类作为整体对其他类是可见的,并不代表该类的所有数据成员和成员方法也同时对其他类是可见的,这得由这些数据成员和成员方法的修饰符来决定。需要注意的是,数据成员和成员方法的访问控制符被声明为public,会造成安全性和封装性下降,所以一般应尽量少用。,【例5.13】public访问控制符的使用。缺省访问控制符friendly如果一个类没有访问控制符,说明它具有缺省的访问控制特性。这种缺省的访问控制特性称为“友好访问”,即friendly,它规定只有在同一个包中的对象才能访问和引用这些类,因此,又称为包访问性。,保护访问控制符protected用protected修饰的成员变量可以被3种类所引用,该类自身、与它在同一个包中的其他类及在其他包中的该类的子类。使用protected修饰符的主要作用是,允许其他包中的它的子类来访问父类的特定属性。【例5.14】protected访问控制符示例。,私有访问控制符private用private修饰的数据成员或成员方法只能被该类自身所访问和修改,而不能被任何其他类(包括该类的子类)来访问和引用,它提供了最高的保护级别。当其他类希望获取或修改私有成员时,需要借助于类的方法来实现。【例5.15】用private修饰的数据成员。,封装与继承的关系其实这两个概念并没有实质性的冲突,在面向对象系统中,封装性主要指的是对象的封装性,即将属于某一类的一个具体的对象封装起来,使其数据和操作成为一个整体。继承机制的引入丝毫没有影响对象的封装性。,5.5多态,多态的概念多态(polymorphism)是面向对象程序设计的一个重要特征。利用多态性可以设计和实现一个易于扩展的系统。,在现实生活中,多态的例子比较常见,如不同班级的同学在听到同一消息上课铃响时会做出不同的反应跑向不同的教室。Java中提供两种多态机制:重载与覆盖。,方法重载在同一类中定义了多个同名而不同内容的成员方法时,这些方法称为重载(overload)。重载的方法主要通过形式参数列表中参数的个数、参数的数据类型和参数的顺序等方面的不同来区分。在编译期间,Java编译器检查每个方法所用的参数数目和类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年热压硫化锌(ZNS)晶体合作协议书
- 2025年饲用原料作物合作协议书
- 2025年特种氯乙烯共聚物合作协议书
- 农村畜牧养殖防疫协议书
- 2025年金昌危运资格证模拟考试题库
- 中介手房屋买卖协议
- 高级专业技术职务聘用工作证明(6篇)
- 2025年管理心理学关键知识及试题及答案定位
- 月薪与奖金补贴完整收入证明(7篇)
- 股东权益保障出资证明材料(8篇)
- 人工流产患者术后护理
- 电子生产企业人力资源管理制度
- 2025届广西壮族自治区柳州市高三三模语文试题【含答案解析】
- 第9课《可爱的一朵玫瑰花》课件 花城版音乐四年级下册
- (完整版)总局关于发布医疗器械分类目录的公告(2017年第104号)新版本医疗器械分类目录2018版
- 房屋建筑工程竣工验收技术资料统一用表(2024 版)
- 康复医学科治疗技术操作规范2023版
- 磷酸铁及磷酸铁锂异物防控管理
- 2025年河长制知识竞赛题库及答案(共100题)
- 精神科幻觉护理常规
- 渑池项目部砂石骨料生产线安全操作规程(修订)
评论
0/150
提交评论