资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,立体化教材计算机系列,Java,程序设计,*,JAVA,JAVA,JAVA程序设计,第,六章,Java,面向对象的特征,目 录,Java,的继承机制,多态,包,经典练习题,接口,抽象类与抽象方法,重点与难点点拨,本章知识重点,3,1,3,2,抽象类与抽象方法,3,3,Java的,多态性,3,4,Java的,接口,Java的,包,3,5,Java的,继承机制,本章知识难点,3,1,3,2,多态性的体现,3,3,构造方法及其继承,3,4,对象的类型转换,接口的概念与实现,3,5,继承的实现,Java,的继承机制,继承的概念,继承的意义与特征,构造方法的继承,继承的实现,继承机制下成员要素的行为,最终类与最终成员要素,对象的类型转换,继承的概念,继承也称为派生,其概念来源于这样一种思想:同类事物具有共同性,在同类事物中,每个事物又具有其特殊性。运用抽象的原则舍弃对象的特殊性,抽取其共性,便得到适应于一组对象的类,这便是一般类或通用类,而把具有特殊性的类称为特殊类或具体类。假定,B,类与,C,类具有,A,类的全部属性和方法,同时又分别具有自己特有的某些属性和方法,则把类,A,称作一般类,把类,B,与类,C,称作类,A,的特殊类。,车类层次结构图,车类层次结构图为例,来演示继承关系:,继承的意义,继承很好地解决了软件复用。通过继承,一个类可以拥有已有类的所有功能。因此,只需指明新类与现有类的不同,即增加自己的属性和方法即可,从而有效地减少了代码和数据的冗余度,增强了程序的可重用性。举例而言:假定,B,类继承了,A,类,(,即,A,类是,B,类的基类,),,建立,B,类时只需增加与,A,类不同的特征,(,成员数据和成员方法,),的描述,不需再重新定义,A,类已有的特征,。,继承的特征,3,3,3,4,3,1,3,2,继承关系是传递的,继承简化了人们对事物的认识和描述,能清晰体,现相关类之间的层次结构关系,通过增强一致性来减少模块的接口和界面,大大,增加程序的易维护性,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,修饰的成员方法称为最终方法或禁止覆盖方法。,最终成员要素,3,3,3,1,3,2,final,变量:用,final,修饰的成员变量将自动成为,常量,这类常量只能被初始化一次,以后不再允,许被改变,初始化过程一般是在定义时同时进行的,final,方法:被,final,修饰的方法能够被子类继承,,但不允许被子类覆盖,/,重写,也不允许被子类扩展,final,类:被,final,修饰的类成为最终类,这种类,不能被继承,即可能派生子类,最终类与最终成员要素,final,修饰符能够用来修饰类及类的成员要素。,final,修饰的类称为最终类或终止继承类;,final,修饰的成员变量称为常量;,final,修饰的成员方法称为最终方法或禁止覆盖方法,对象的类型转换,基本数据类型可以进行类型转换,,Java,支持隐式,(,自动,),及显式,(,强制,),两种类型转换方式,类的对象也能够进行类型转换。为讲述方便,将对象所属的类称为对象类型,类型转换,(Type Casting),也称为塑型,对象类型转换遵循的原则,3,3,3,1,3,2,对象类型转换必须在继承的层次内进行,否则程序,将出现异常,向上转型是安全的,向下转型是危险的,对象类型转换遵循的原则(续),3,5,3,6,3,4,对象能够转换为对象类型实现的一个接口,一个对象被转换为父类对象或接口引用变量,还可,以再转换回它原来的对象类型,在类的继承结构中,处于相同层次的类对象之间不能,进行转换,抽象类与抽象方法,3,1,3,2,类与方法的抽象,抽象类与抽象方法的应用,有关抽象类的说明,抽象类的意义,有关抽象方法的说明,抽象类,抽象方法,类与方法的抽象,抽象类:就是不能使用,new,关键字进行实例化的类,即没有具体实例对象的类。抽象类通常不具备实际功能,不能创建对象,只作为专门用来派生其他子类的基类。定义抽象类的目的是为子类提供公共信息与接口。,抽象方法:是一种不完整的方法,它只包含有方法声明,而无方法体的定义,因而抽象方法是只有方法原型而无功能实现的一种行为规范,用来为所在类的子类声明方法的接口标准。,有关抽象类的说明,当声明类被为抽象类时,需要在这个类前加修饰,abstract,抽象类通常包含若干个,(,可为零个,),抽象方法;但不能在,非抽象类中声明抽象方法,抽象类不能创建对象,创建对象的工作由抽象类派生的,非抽象子类来实现,3,3,3,4,3,1,3,2,抽象类可以包含非抽象类所能包含的任何元素,这些要,素包含具体的属性、非抽象方法以及多个重载的构造方法,有关抽象类的说明,(,续,1,),抽象类中不可包含抽象构造方法或抽象静态方法,抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类,若一个类中包含了至少一个抽象方法,则该类必须被声,明为抽象类;但声明为抽象类的类不一定要包含抽象方法,抽象类必须被子类继承,并由子类实现它的所有抽象方法,没有所谓的最终抽象类,即抽象类不能再用,final,修饰类声明,3,5,3,6,3,7,3,8,3,9,有关抽象类的说明,(,续,2),不能创建,abstract,类的实例。然而可以创建一个引用型号变量,其类型为,一个抽象类,并让它指向非抽象子类的一个实例,抽象类中不能定义,private,类型的成员变量和成员方法,若一个子类继承了一个抽象类,该子类没有实现抽象类中定义的每一个,抽象方法,则该类仍然为抽象类,必须在它的类定义语句中加上,abstract,抽象修饰符。直到某个子类实现了它所有祖先类声明的抽象方法,该类,才不再是抽象类,才能够生成实例对象,3,10,3,11,3,12,抽象类的意义,3,5,3,3,3,4,3,1,3,2,抽象类实现自然界的抽象概念,体现数据抽象的思想,,是实现程序多态性的一种手段,抽象类是类层次中较高层次的概括,抽象类能让其子,类继承它的抽象化的特征,抽象类从更高级别上描述概念性的内容,抽象类中可,以包括被其所有子类共享的公共属性与公共行为,有,利于对所要解决问题的概念层次关系的组织与设计,抽象类提供了可由其子类共享的一般形式,能够更好,地统一用户接口,抽象类是其所有子类公共属性的集合,可以充分利用,这些公共属性来提高程序开发和维护的效率,抽象方法的说明,抽象方法只需方法头的声明,无需实现方法体,absteact,不能与,private,、,static,、,final,或,native,并列修饰同一个方,法,即标明为,private,、,static,、,final,或,native,类型的方法不能再,声明为抽象的,如果一个类中含有抽象方法,则必须将这个类声明为抽象类,所有的抽象方法,都必须定义于抽象类中。只有抽象类才能,具有抽象方法,3,3,3,4,3,1,3,2,有关抽象方法的说明,(,续,),一个抽象类的子类如果不是抽象类,则它必须实现抽象基类中的每一,个抽象方法,即重写抽象基类中的所有抽象方法,如果父类中已有同名的,absteact,方法,则子类中就不能声明同名的抽象,方法。抽象方法的真正实现由所在抽象类的不同子类在各自的类定义,中完成。各子类将从抽象父类继承来的所有抽象方法进行重写,形成,各自具有相同方法名,相同返回值类型,相同参数列表,目的一致但,是具体实现有一定差别的方法,抽象方法最后的分号不能省略,分号用来代替方法体的定义,3,5,3,6,3,7,抽象方法的意义,3,3,3,1,3,2,抽象方法能够隐藏具体的细节信息,使调用该方法的,程序不必过分关注该类和它的各个子类的内部状况,抽象方法为抽象类的子类规定了它们可用的标准行为,与接口。抽象类的所有非抽象子类都必须完成父类中,声明的抽象方法,抽象方法提供了实现一个接口,多种方法的机制,即,所有的子类对外都呈现相同名字的方法接口,接口,接口的概念,接口的定义,接口类型与接口变量,接口的实现,接口、类与抽象类,接口的概念,下面通过一个实际例子来说明接口的意义。,假定有三个类:,Academician,,,Professor,,,Housewife,,分别代表大学生,教授和家庭主妇三类群体,下面是他们一天的活动安排情况,接口的,UML,表达,UML,中,用带有三角箭头的虚线来表达类对接口的实现,这点与子类对基类的继承不太相同,后者表达所用的是带有三角箭头的实线。,下面用,UML,图表达实例中接口与各个类之间的实现关,接口的定义,定义接口要使用,interface,关键字。接口的定义包括接口头部声明与接口体定义两部分。,接口定义的格式为:,接口修饰符,interface extends /,接口头部声明,/,接口体定义,/,常量数据成员声明,public static final =;,接口的定义,(续),public static final =;,/,抽象方法声明,public abstract native (),throws;,public abstract native (),throws;,接口的实现,3,3,3,4,3,1,3,2,实现接口的声明位置要在类定义的头部声明中,,implements,关键字表明一个类要实现的接口列表,一个类可以实现一个接口,也可同时实现多个接,口,对于包含多个接口的接口名列表,各接口名,字之间用逗号分开,实现接口的类可以使用接口中定义的所有常量,如果实现接口的类是抽象类,它可以不实现接,口中定义的所有抽象方法,接口的实现,(续),3,5,3,6,3,7,3,8,如果实现接口的类不是抽象类,则在类体中必须实现接口的所,有抽象方法,为所有抽象方法定义方法体,类在实现接口的抽象方法时,必须使用完全一致的方法原型,接口的抽象方法的访问修饰符只能为,public,,这就决定了实现,接口的类在实现接口方法时,必须显式地使用,public,修饰符,,而不能使用其他限制更为严格的访问修饰符,(,如,protected,等,),,,否则将被系统警告为缩小了接口定义方法的访问控制范围,子类可以直接继承使用接口基类中的各种方法,并能够超越,(,抑制,),或重载它们,接口类型与接口变量,接口可以作为一种引用数据类型来使用,称这种引用数据类型为接口类型。可以定义接口类型的引用变量,这种使用接口名称作为类型的引用变量被称为接口变量。接口变量可以用作方法的形参,也可以作为全局变量或局部变量来使用。,Java,中,还可以声明接口类型的数组。,Java,中,允许用接口变量来引用实现接口的类对象或子类对象。,接口、类与抽象类,接口的特征与意义,接口的应用场合,接口与类的区别与联系,表的补充说明,接口的特征与意义,多个类能够共享相同的接口,遵循相同的对外规范,每个类只需关注自己对接口方法的具体实现,而不,需要知道其它类是如何实现接口方法的,3,3,3,1,3,2,接口定义了一个抽象类的协议,揭示了一组对象的,编程接口,而不揭示类的实际程序体,不关心接口,的具体的实现,接口的应用场合,3,3,3,4,3,1,3,2,接口捕获无关类之间的相似性,而不强迫类之间,产生关系,通过接口指明多个类需要实现的方法集合的并集,通过接口了解对象的交互界面,而无需了解对象,所对应的类,Java,只支持单一继承,在需要多重继承的情况时,,通过接口来实现,接口与类的区别与联系,对上表的说明,3,3,3,1,3,2,接口的,extends,子句与类的,extends,子句基本相同,,不同的是一个接口可有多个父接口,用逗号将它们,隔开,而一个类最多只能有一个父类,但可以实现,多个接口,接口与一般类一样,本身也具有成员数据与成员方,法,但成员数据为常量,且一定要赋初值,此值将,不能再被更改,接口是纯设计形式,不提供方法的实现,接口中不,能包含任何可以执行的非抽象方法,多态,重要概念,方法重载,(Overload),方法覆盖,/,重写,(Override),方法重载与方法覆盖,的比较,重要概念,多态性,(Polymorphism),是指在基类中定义的属性或方法被派生类继承后,可以具有不同的数据类型,或表现出不同的行为,从而使得同一个属性或方法在基类及其各个派生类中具有不同的语义。,Java,的多态性体现在两个方面:,方法重载实现的静态多态性,又称为编译时多态,方法覆盖,/,重写实现的动态多态性,又称为运行时多态,3,1,3,2,方法重载,与方法覆盖,方法重载与方法覆盖是实现多态的两种形式,一个类定义了多个名字相同而参数不同的成员方法或构造方法,称为方法的重载。方法重载包括构造方法的重载和成员方法的重载,方法重载,(Overload),关于方法重载的使用要注意以下几点:,3,3,3,1,3,2,调用重载方法时一定要给出正确的参数,系统根据给定的参,数数目、类型、次序三个因素来决定到底调用哪个同名方法,定义重载方法时,参数的个数、类型或排列顺序一定要有,所区别,方法返回类型的不同,不能用来区分同名方法,因不能做为方法重载的,依据,方法覆盖,/,重写,(Override),在子类中重新定义与父类同名的方法称为方法覆盖或方法重写。覆盖方法的调用原则:,Java,系统根据运行时所调用方法的对象类型,来决定调用哪个方法。若为子类的实例对象,如果子类覆盖了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法而并未覆盖,则运行时系统调用父类的方法。,方法重载与方法覆盖的比较,3,3,3,1,3,2,重载是名称相同但参数不同的多个方法在同一个类中的表现形式;覆盖则是在具有继承关系的不同类之间,子类重新定义来自父类方法的一种表现形式,重载方法不能有相同的形参表;覆盖方法则必须有相同的方法名、形参列表和返回值,重载方法调用时利用不同的实际参数进行同类方法的选择;覆盖方法调用时利用不同的前缀来选择不同类的方法,方法重载与方法覆盖的比较,3,4,方法重载只是提供了更多的选择,而不意味着替代;方法覆盖具有替代的意味,两个具有覆盖关系的方法被认为具有相同的语义,3,5,3,6,final,方法可以被重载;但是不能被覆盖,构造方法可以被重载;但是不能被覆盖,包,包的概念,创建自定义包,引用包,Java,类库,包的概念,包,(package),是,JAVA,提供的管理类和接口的工具,是,Java,用来管理名称空间的一种机制。包是一组相关类和接口的集合。为了组织与使用方便,通常将需要在一起工作的类和接口放在一个包中,而将没有协作关系的类和接口分装在不同的包中。这样既可以避免重名冲突,也能够限定包之间类的访问权限,利于更有效地管理众多的类和接口。,包的概念说明,3,3,3,4,3,1,3,2,3,5,包是类和接口的容器,它是一种松散的组织结构,包中的类和接口,可以没有严格的关系,将它们组织在一起,仅仅是为了管理的方便,一个包对应一个文件夹。包是一种层次结构,包中还可以包含子包,,类似于文件夹中还可以有子文件夹,Java,中的每一个类与接口都属于一个特定的包,包是用来管理名称空间的,同一个包中的类名要唯一,不能重复;,不同包中可以有相同的类名,创建包的语句和引入包的语句都要放在类的定义前面,这两类语,句是必须出现在类定义体括号外面仅有的两种语句,创建自定义包,包的定义通过关键字,package,来实现,定义的一般形式为:,package ;,语句说明,:,创建包就是在当前文件夹下创建一个子文件夹,以便存放这个包中含有的所有类代码,每个,JAVA,源程序文件中最多只能有一条,package,语句,,package,语句必须为程序文件的第一条语句,包名标识符一般采用小写字母表示,以便与类名,有所区分,3,3,3,1,3,2,创建自定义包,(续,1,),package,语句缺省时,系统会自动为当前的文件,创建一个默认的匿名包,Java,处理,package,语句的过程为:首先检查语句中指定的包,(,文件夹,),是否已经存在;如果存在,则直接使用这一文件夹作为存放类文件的目录;如果不存在,则由系统创建该文件夹。,JAVA,程序编译后生成的类代码,(,即,.class,文件,),都被存放在,package,语句指定的包中,3,4,3,5,创建自定义包,(续,2,),创建不同等级的包:,可以用,package,关键字创建不同等级的包。不同等级的包对应于嵌套的多级目录结构。创建不同等级包的命令格式为:,package.;,引用包的策略,3,3,3,1,3,2,类名前加上该类所在的完整包路径,在程序起始处用,import,语句引入所需要的包或,包中的类,以后在程序中就可以直接使用该包中,的类,而无需再用包名作前缀。这是一种一劳永,逸的策略,也是大多数编程者采用的做法,使用环境变量,CLASSPATH,设置所用的包的路径,Java,类库,Java,系统事先设计并实现了许多标准类与接口的集合,每一个类与接口都属于一个特定的包。编程者引用这些标准包中的类与接口,能够更方便、更快捷地开发,Java,程序。这些包被称为,Java,的,API(,应用程序接口,),包,又称为,Java,的类库。,Java,类库,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,系统自动导入的类库。,Java,中常见的包,什么是继承?如何定义继承关系?,子类可以继承父类中哪些方法与属性?,什么是抽象方法?如何定义、使用抽象方法?,什么是接口?为什么要定义接口?,如何在类中实现一个接口?一个类可以实现多个接口吗?,简答,练习题,定义一个接口,接口中有三个抽象方法:,long fact(,int,m);,方法的功能为求参数的阶乘。,long,intPower(int,m,int,n);,方法的功能为求参数,m,的,n,次方。,boolean,findFactor,(,int,m,int,n);,方法的功能为判断参数中较小数是否为较大数的因子。,定义类实现该接口。编写应用程序,调用接口中的三个方法,并将调用方法所得的结果输出。,编程练习题,再 见,谢谢你的配合!,
展开阅读全文