已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章 Java面向对象的特征,目 录,Java的继承机制,多态,包,经典练习题,接口,抽象类与抽象方法,重点与难点点拨,本章知识重点,抽象类与抽象方法,Java的多态性,Java的接口,Java的包,Java的继承机制,本章知识难点,多态性的体现,构造方法及其继承,对象的类型转换,接口的概念与实现,继承的实现,Java的继承机制,继承机制下成员要素的行为,最终类与最终成员要素,对象的类型转换,继承的概念,继承也称为派生,其概念来源于这样一种思想:同类事物具有共同性,在同类事物中,每个事物又具有其特殊性。运用抽象的原则舍弃对象的特殊性,抽取其共性,便得到适应于一组对象的类,这便是一般类或通用类,而把具有特殊性的类称为特殊类或具体类。假定B类与C类具有A类的全部属性和方法,同时又分别具有自己特有的某些属性和方法,则把类A称作一般类,把类B与类C称作类A的特殊类。,车类层次结构图,车类层次结构图为例,来演示继承关系:,继承的意义,继承很好地解决了软件复用。通过继承,一个类可以拥有已有类的所有功能。因此,只需指明新类与现有类的不同,即增加自己的属性和方法即可,从而有效地减少了代码和数据的冗余度,增强了程序的可重用性。举例而言:假定B类继承了A类(即A类是B类的基类),建立B类时只需增加与A类不同的特征 (成员数据和成员方法)的描述,不需再重新定义A类已有的特征。,继承的特征,继承关系是传递的,继承简化了人们对事物的认识和描述,能清晰体 现相关类之间的层次结构关系,通过增强一致性来减少模块的接口和界面,大大 增加程序的易维护性,Java不支持类的多重继承,只支持类的单一继承,继承的实现,Java程序中,继承通过extends关键字来实现。子类对父类的继承是在类的声明中通过关键字extends来指明。 实现继承的语法结构为: 修饰符 class extends /类体定义 ,继承的示例,【例】实现两个类的描述:基类人(Person)及子类学生(Pupil)。人具有姓名(name)、年龄(age)、性别(sex)及配偶姓名(spouseName)四类属性,同时具有工作(work)、休息(rest)、娱乐(amusement)及处理家务(housework)四种行为方法。学生将从人这一父类中继承除配偶姓名以外的三类属性,并继承及除工作和处理家务以外的两类行为,同时要添加自身类特有的几类属性:所属学校(school)、所学专业(specialty)及所在年级(degree),同时还要增加几种学生的行为方法:学习(study)与考试(exam)。,UML图表达类的继承关系,构造方法的继承,构造方法是类中最为特殊的方法。 子类能够继承基类的非私有成员要素,而构造方法为公共类型,因此子类能够继承基类的构造方法。,继承关系示例,【例】点(Point)类描述了平面坐标系下的一个坐标点的属性与方法。由点类派生出两个子类:圆类(Circle)与矩形类(Rectangle)。圆类除了圆心坐标外,还具有半径(radius)属性;矩形类除左上角的坐标点外,还具有长度(width)与高度(height)属性。分别为每个类创建一些实例对象并输出其相关信息。 用UML图表示Point、Circle与Rectangle类的继承关系,用UML图表示,继承机制下成员要素的行为,继承机制下,类的成员要素的行为方式将会发生很大的变化。子类可以定义与基类相同的成员变量和成员方法,这种情况下,Java系统将面临如何解决成员要素定义的二义性冲突现象。 对于属性而言,子类在实现继承父类属性的同时,可以定义与父类属性相同名称与类型的自身属性,子类在执行自身方法时,默认情况下使用的是自身定义的属性,从而将父类的同名属性暂时屏蔽掉。这种原则称为属性隐藏。,继承机制下成员要素的行为,同样,对于成员方法而言,子类在继承父类方法的同时,可以定义与父类原型相同而方法的具体实现不同的自身的成员方法,子类在自身方法中调用与父类同名的方法时,默认情况下调用的是自身定义的方法,从而相当于重新实现了父类的方法功能。这一原则称为方法覆盖。,最终类与最终成员要素,final修饰符能够用来修饰类及类的成员要素。final修饰的类称为最终类或终止继承类;final修饰的成员变量称为常量;final修饰的成员方法称为最终方法或禁止覆盖方法。,最终成员要素,final变量:用final修饰的成员变量将自动成为 常量,这类常量只能被初始化一次,以后不再允 许被改变,初始化过程一般是在定义时同时进行的,final方法:被final修饰的方法能够被子类继承, 但不允许被子类覆盖/重写,也不允许被子类扩展,final类:被final修饰的类成为最终类,这种类 不能被继承,即可能派生子类,最终类与最终成员要素,final修饰符能够用来修饰类及类的成员要素。final修饰的类称为最终类或终止继承类;final修饰的成员变量称为常量;final修饰的成员方法称为最终方法或禁止覆盖方法,对象的类型转换,基本数据类型可以进行类型转换,Java 支持隐式(自动)及显式(强制)两种类型转换方式,类的对象也能够进行类型转换。为讲述方便,将对象所属的类称为对象类型,类型转换(Type Casting),也称为塑型,对象类型转换遵循的原则,对象类型转换必须在继承的层次内进行,否则程序 将出现异常,向上转型是安全的,向下转型是危险的,对象类型转换遵循的原则(续),对象能够转换为对象类型实现的一个接口,一个对象被转换为父类对象或接口引用变量,还可 以再转换回它原来的对象类型,在类的继承结构中,处于相同层次的类对象之间不能 进行转换,抽象类与抽象方法,类与方法的抽象,抽象类与抽象方法的应用,类与方法的抽象,抽象类:就是不能使用new关键字进行实例化的类,即没有具体实例对象的类。抽象类通常不具备实际功能,不能创建对象,只作为专门用来派生其他子类的基类。定义抽象类的目的是为子类提供公共信息与接口。 抽象方法:是一种不完整的方法,它只包含有方法声明,而无方法体的定义,因而抽象方法是只有方法原型而无功能实现的一种行为规范,用来为所在类的子类声明方法的接口标准。,有关抽象类的说明,当声明类被为抽象类时,需要在这个类前加修饰abstract,抽象类通常包含若干个(可为零个)抽象方法;但不能在 非抽象类中声明抽象方法,抽象类不能创建对象,创建对象的工作由抽象类派生的 非抽象子类来实现,抽象类可以包含非抽象类所能包含的任何元素,这些要 素包含具体的属性、非抽象方法以及多个重载的构造方法,有关抽象类的说明(续1),抽象类中不可包含抽象构造方法或抽象静态方法,抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类,若一个类中包含了至少一个抽象方法,则该类必须被声 明为抽象类;但声明为抽象类的类不一定要包含抽象方法,抽象类必须被子类继承,并由子类实现它的所有抽象方法,没有所谓的最终抽象类,即抽象类不能再用final修饰类声明,有关抽象类的说明(续2),不能创建abstract类的实例。然而可以创建一个引用型号变量,其类型为 一个抽象类,并让它指向非抽象子类的一个实例,抽象类中不能定义private类型的成员变量和成员方法,若一个子类继承了一个抽象类,该子类没有实现抽象类中定义的每一个 抽象方法,则该类仍然为抽象类,必须在它的类定义语句中加上abstract 抽象修饰符。直到某个子类实现了它所有祖先类声明的抽象方法,该类 才不再是抽象类,才能够生成实例对象,抽象类的意义,抽象类实现自然界的抽象概念,体现数据抽象的思想, 是实现程序多态性的一种手段,抽象类是类层次中较高层次的概括,抽象类能让其子 类继承它的抽象化的特征,抽象类从更高级别上描述概念性的内容,抽象类中可 以包括被其所有子类共享的公共属性与公共行为,有 利于对所要解决问题的概念层次关系的组织与设计,抽象类提供了可由其子类共享的一般形式,能够更好 地统一用户接口,抽象类是其所有子类公共属性的集合,可以充分利用 这些公共属性来提高程序开发和维护的效率,抽象方法的说明,抽象方法只需方法头的声明,无需实现方法体,absteact不能与private、static、final或native并列修饰同一个方 法,即标明为private、static、final或native类型的方法不能再 声明为抽象的,如果一个类中含有抽象方法,则必须将这个类声明为抽象类,所有的抽象方法,都必须定义于抽象类中。只有抽象类才能 具有抽象方法,有关抽象方法的说明(续),一个抽象类的子类如果不是抽象类,则它必须实现抽象基类中的每一 个抽象方法,即重写抽象基类中的所有抽象方法,如果父类中已有同名的absteact方法,则子类中就不能声明同名的抽象 方法。抽象方法的真正实现由所在抽象类的不同子类在各自的类定义 中完成。各子类将从抽象父类继承来的所有抽象方法进行重写,形成 各自具有相同方法名,相同返回值类型,相同参数列表,目的一致但 是具体实现有一定差别的方法,抽象方法最后的分号不能省略,分号用来代替方法体的定义,抽象方法的意义,抽象方法能够隐藏具体的细节信息,使调用该方法的 程序不必过分关注该类和它的各个子类的内部状况,抽象方法为抽象类的子类规定了它们可用的标准行为 与接口。抽象类的所有非抽象子类都必须完成父类中 声明的抽象方法,抽象方法提供了实现一个接口,多种方法的机制,即 所有的子类对外都呈现相同名字的方法接口,接口,接口、类与抽象类,接口的概念,下面通过一个实际例子来说明接口的意义。 假定有三个类:Academician,Professor,Housewife,分别代表大学生,教授和家庭主妇三类群体,下面是他们一天的活动安排情况,接口的UML表达,UML中,用带有三角箭头的虚线来表达类对接口的实现,这点与子类对基类的继承不太相同,后者表达所用的是带有三角箭头的实线。 下面用UML图表达实例中接口与各个类之间的实现关,接口的定义,定义接口要使用interface关键字。接口的定义包括接口头部声明与接口体定义两部分。 接口定义的格式为: 接口修饰符 interface extends /接口头部声明 /接口体定义 /常量数据成员声明 public static final =;,接口的定义(续),public static final =; /抽象方法声明 public abstract native () throws ; public abstract native () throws ; ,接口的实现,实现接口的声明位置要在类定义的头部声明中, implements关键字表明一个类要实现的接口列表,一个类可以实现一个接口,也可同时实现多个接 口,对于包含多个接口的接口名列表,各接口名 字之间用逗号分开,实现接口的类可以使用接口中定义的所有常量,如果实现接口的类是抽象类,它可以不实现接 口中定义的所有抽象方法,接口的实现(续),如果实现接口的类不是抽象类,则在类体中必须实现接口的所 有抽象方法,为所有抽象方法定义方法体,类在实现接口的抽象方法时,必须使用完全一致的方法原型,接口的抽象方法的访问修饰符只能为public,这就决定了实现 接口的类在实现接口方法时,必须显式地使用public修饰符, 而不能使用其他限制更为严格的访问修饰符(如protected等), 否则将被系统警告为缩小了接口定义方法的访问控制范围,子类可以直接继承使用接口基类中的各种方法,并能够超越(抑制) 或重载它们,接口类型与接口变量,接口可以作为一种引用数据类型来使用,称这种引用数据类型为接口类型。可以定义接口类型的引用变量,这种使用接口名称作为类型的引用变量被称为接口变量。接口变量可以用作方法的形参,也可以作为全局变量或局部变量来使用。Java中,还可以声明接口类型的数组。 Java中,允许用接口变量来引用实现接口的类对象或子类对象。,接口、类与抽象类,接口的特征与意义,接口的应用场合,接口与类的区别与联系,表的补充说明,接口的特征与意义,多个类能够共享相同的接口,遵循相同的对外规范,每个类只需关注自己对接口方法的具体实现,而不 需要知道其它类是如何实现接口方法的,接口定义了一个抽象类的协议,揭示了一组对象的 编程接口,而不揭示类的实际程序体,不关心接口 的具体的实现,接口的应用场合,接口捕获无关类之间的相似性,而不强迫类之间 产生关系,通过接口指明多个类需要实现的方法集合的并集,通过接口了解对象的交互界面,而无需了解对象 所对应的类,Java只支持单一继承,在需要多重继承的情况时, 通过接口来实现,接口与类的区别与联系,对上表的说明,接口的extends 子句与类的extends子句基本相同, 不同的是一个接口可有多个父接口,用逗号将它们 隔开,而一个类最多只能有一个父类,但可以实现 多个接口,接口与一般类一样,本身也具有成员数据与成员方 法,但成员数据为常量,且一定要赋初值,此值将 不能再被更改,接口是纯设计形式,不提供方法的实现,接口中不 能包含任何可以执行的非抽象方法,多态,重要概念,方法重载(Overload),方法覆盖/重写(Override),方法重载与方法覆盖的比较,重要概念,多态性(Polymorphism)是指在基类中定义的属性或方法被派生类继承后,可以具有不同的数据类型,或表现出不同的行为,从而使得同一个属性或方法在基类及其各个派生类中具有不同的语义。 Java的多态性体现在两个方面:,方法重载实现的静态多态性,又称为编译时多态,方法覆盖/重写实现的动态多态性,又称为运行时多态,方法重载与方法覆盖,方法重载与方法覆盖是实现多态的两种形式,一个类定义了多个名字相同而参数不同的成员方法或构造方法,称为方法的重载。方法重载包括构造方法的重载和成员方法的重载,方法重载(Overload),关于方法重载的使用要注意以下几点:,调用重载方法时一定要给出正确的参数,系统根据给定的参 数数目、类型、次序三个因素来决定到底调用哪个同名方法,定义重载方法时,参数的个数、类型或排列顺序一定要有 所区别,方法返回类型的不同,不能用来区分同名方法,因不能做为方法重载的 依据,方法覆盖/重写(Override),在子类中重新定义与父类同名的方法称为方法覆盖或方法重写。覆盖方法的调用原则:Java系统根据运行时所调用方法的对象类型,来决定调用哪个方法。若为子类的实例对象,如果子类覆盖了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法而并未覆盖,则运行时系统调用父类的方法。,方法重载与方法覆盖的比较,重载是名称相同但参数不同的多个方法在同一个类中的表现形式;覆盖则是在具有继承关系的不同类之间,子类重新定义来自父类方法的一种表现形式,重载方法不能有相同的形参表;覆盖方法则必须有相同的方法名、形参列表和返回值,重载方法调用时利用不同的实际参数进行同类方法的选择;覆盖方法调用时利用不同的前缀来选择不同类的方法,方法重载与方法覆盖的比较,方法重载只是提供了更多的选择,而不意味着替代;方法覆盖具有替代的意味,两个具有覆盖关系的方法被认为具有相同的语义,final方法可以被重载;但是不能被覆盖,构造方法可以被重载;但是不能被覆盖,包,包的概念,创建自定义包,引用包,Java类库,包的概念,包(package)是JAVA提供的管理类和接口的工具,是Java用来管理名称空间的一种机制。包是一组相关类和接口的集合。为了组织与使用方便,通常将需要在一起工作的类和接口放在一个包中,而将没有协作关系的类和接口分装在不同的包中。这样既可以避免重名冲突,也能够限定包之间类的访问权限,利于更有效地管理众多的类和接口。,包的概念说明,包是类和接口的容器,它是一种松散的组织结构,包中的类和接口 可以没有严格的关系,将它们组织在一起,仅仅是为了管理的方便,一个包对应一个文件夹。包是一种层次结构,包中还可以包含子包, 类似于文件夹中还可以有子文件夹,Java中的每一个类与接口都属于一个特定的包,包是用来管理名称空间的,同一个包中的类名要唯一,不能重复; 不同包中可以有相同的类名,创建包的语句和引入包的语句都要放在类的定义前面,这两类语 句是必须出现在类定义体括号外面仅有的两种语句,创建自定义包,包的定义通过关键字package来实现,定义的一般形式为: package ; 语句说明:,创建包就是在当前文件夹下创建一个子文件夹,以便存放这个包中含有的所有类代码,每个JAVA源程序文件中最多只能有一条package语句,package语句必须为程序文件的第一条语句,包名标识符一般采用小写字母表示,以便与类名 有所区分,创建自定义包(续1),package语句缺省时,系统会自动为当前的文件 创建一个默认的匿名包,Java处理package语句的过程为:首先检查语句中指定的包(文件夹)是否已经存在;如果存在,则直接使用这一文件夹作为存放类文件的目录;如果不存在,则由系统创建该文件夹。 JAVA程序编译后生成的类代码(即.class文件)都被存放在package语句指定的包中,创建自定义包(续2),创建不同等级的包: 可以用package关键字创建不同等级的包。不同等级的包对应于嵌套的多级目录结构。创建不同等级包的命令格式为: package .;,引用包的策略,类名前加上该类所在的完整包路径,在程序起始处用impo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《环氧树脂使用教案》课件
- 吉林省长春市虹麓综合高中2023-2024学年高一上学期期末生物试卷
- 浙江省六校联盟2024-2025学年高二上学期期中联考历史试题 含解析
- 痔疮的中西医结合治疗
- 金融产品运营方案
- 木制品定制生产销售承包合同
- 航空巨头CEO聘任合同
- 教育培训机构高管聘用合同样本
- 企业行政管家招聘合同书
- 衢州市户外拓展基地租赁合同
- 2024年华锦集团面向集团公司招聘笔试参考题库含答案解析
- 一张纸的劳务合同书
- 急性肺水肿的护理课件
- 压力容器制造评审记录
- DB3209-T 1217-2022 地理标志产品 盐城大米
- 人工智能数据标注试题及答案
- 2024届上海市华师大二附中高一上数学期末检测试题含解析
- 《城南旧事》常考知识点梳理及阅读训练题全套
- 校长研修计划(通用9篇)
- 国有企业人才培养机制
- 美容医疗机构、医疗美容科(室)基本标准试行
评论
0/150
提交评论