Java初学 简单课件 第3章 类的封装、继承和多态

上传人:da****ge 文档编号:243096134 上传时间:2024-09-15 格式:PPT 页数:101 大小:2.75MB
返回 下载 相关 举报
Java初学 简单课件 第3章 类的封装、继承和多态_第1页
第1页 / 共101页
Java初学 简单课件 第3章 类的封装、继承和多态_第2页
第2页 / 共101页
Java初学 简单课件 第3章 类的封装、继承和多态_第3页
第3页 / 共101页
点击查看更多>>
资源描述
,单击鼠标编辑大纲正文格式,第二个大纲级,第三个大纲级,第四个大纲级,第五个大纲级,第六个大纲级,第七个大纲级,第八个大纲级,第九个大纲级,*,单击鼠标编辑标题文的格式,单击鼠标编辑大纲正文格式,第二个大纲级,第三个大纲级,第四个大纲级,第五个大纲级,第六个大纲级,第七个大纲级,第八个大纲级,第九个大纲级,单击鼠标编辑标题文的格式,*,基本概念,面向过程,的程序设计思想,:,在解决问题的时候,从问题的每个细节入手来展开系统,流程,比较适用于解决简单的问题。“面向过程”是一种,以事,件为中心,的编程思想。它并不关心整体,而是关心整体中的,每个细节。,面向对象,的程序设计,(Object Oriental Programming,,,OOP),思想,:,最近十年发展起来的程序设计模式,其目标是,将软件系统,待处理问题或者事务抽象为对象,(Object),,由于对象本身具有一,定的特征和行为,因此可以通过对象间的消息传递的方式驱动,对象的动作,进而实现软件系统的功能。,1,基本概念,类,是数据和对数据操作的封装体。,类具有,封装性、继承性、多态性和抽象性;,这些特性,提供,软件复用机制,,,增强,软件的扩充能,力,,,提高,软件的可维护性,。,Java,的面向对象机制从,C+,发展而来:,完善了,C+,类的,封装、继承、多态和抽象,等基本概念;,放弃了,C+,的,多重继承、友元类和运算符重载,等易产生歧义且安全性差的诸多特性;,采用,单重继承,+,接口,的方式实现多重继承功能,提供,内存自动管理,和,异常处理,机制。,2,第,3,章 类的封装、继承和多态,3.1,类和对象,3.2,类的封装性,3.3,类的继承性,3.4,类的多态性,3.5,类的抽象性,3,面向对象程序设计思想:,将,数据域和对数据的操作,合,起来作为一个整体进行设计。,对象,具有属性和行为能力的实体。,对象参与软件运行,多种对象合作完成预定任务。,类,一组对象,的数据类型,是创建对象的模板。,3.1,类和对象,面向对象程序设计,就是把,现实对象及其关系,抽象,为,问题域的类及其关系,,用程序设计语言,设计类,,,再,创建对象实现指定功能,。,4,3.1,类和对象,3.1.1,类,3.1.2,对象,5,1.,声明类,2.,声明成员变量和成员方法,3.,成员方法重载,3.1.1,类,6,类,(class),类是,数据以及对数据的一组操作,的封装体。,成员变量,类中的数据,反映类的状态和特征;,成员方法,类中对数据的操作,表示类的行为能力。,类的成员,类中的成员变量和成员方法的统称。,注意:,与,数据类型,相似,类是只定义数据及对数据操作的模板,,类本身并,不真正参与程序运行,,实际参与程序运行的是,类,的对象,。,3.1.1,类,7,3.1.1,类,类声明的格式:,类声明,成员变量的声明,;,成员方法的声明及实现,;,类声明,定义该类的名称、访问权限、与其他类的关系等。,成员方法,用来描述对成员变量进行的操作,不但要声明方,法,还要实现方法。,8,1.,声明类,必须项,关键字,class,和自定义的类名;,可选项,方括号,中的;,、,、,、,合法的,Java,标识符,类名标识符,Java,预定通常,首字母大写,。,说明类属性的关键字,,如,public,访问权限、,abstract,抽象类、,final,最终类等。,3.1.1,类,修饰符,class,类, ,extends,父类,implements,接口列表,类的参数,,带参数的类称为泛型类。,9,2.,声明成员变量和成员方法,3.1.1,类,修饰符,数据类型 变量,=,表达式, ,,,变量,=,表达式,;,成员变量声明格式:,一些说明成员属性的关键字,包括访问权限,public,、,protected,、,private,以及静态成员,static,、最终方法和,最终变量,final,等。,10,3.1.1,类,成员方法,用来描述对成员变量进行的操作。,格式如下:,修饰符,返回值类型 方法(,参数列表,),throws,异常类,语句序列;,return ,返回值,;,2.,声明成员变量和成员方法,一些说明成员属性的关键字,包括访问权限,public,、,protected,、,private,以及静态成员,static,、最终方法和,最终变量,final,等。,11,例如:,public class,MyDate,/,类声明,int,year, month, day;,/,声明成员变量,void set (,int,y,int,m,int,d),/,成员方法,设置日期值,/,无返回值,有,3,个参数,year=y;,month=m;,day=d;,3.1.1,类,12,3.,成员方法重载,一个类中,成员变量,不能同名,,但,成员变量与成员方法,可以同名,。,3.1.1,类,重载:,一个类中可以有多个同名的成员方法,,前提是,参数列表必须,不同,称为类的成员方法重载。,重载的作用:,重载多个方法为,一种功能提供多种实现,;,重载方法的区别:,必须以,不同的参数类型、参数个数、参数的次序,来区别。,13,3.1.1,类,例如:,void set (,int,y,int,m,int,d),void set (,int,m,int,d),/,重载方法,参数个数不同,void set (,int,d),void set (,MyDate,d),/,重载方法,参数的数据类型不同,重载的执行:,编译时,根据方法实际参数的数据类型、个数和次,序,决定究竟应该执行重载方法中的哪一个。,注意:,如果两个方法的,参数列表相同,但返回值类型不同,,则不是,重载,将产生编译错误。,14,3.1,类和对象,3.1.1,类,3.1.2,对象,类是用于定义数据及对数据操作的构造数据类型,,类本身,不能参与程序运行,,,实际参与程序运行的是,类的,对象。,15,对象,(object),对象,(,object,),是类的实例,(,instance,),,即类的取值。,类的一个对象能够获得并保存类的一个实例。,类比:,类,对象,类的实例,数据类型,变量,取值,例如:,int,类型,变量,i,取值,10,对象是,动态的,,每个对象都有自己的,生存周期,,都会经历,一个从,创建、运行到消亡,的变化过程。,任何一个对象都有其所属的类。使用对象首先需要声明对象,所属的类,再使对象获得一个类的实例,引用对象的成员变,量和调用对象的方法,使用完后释放对象。,3.1.2,对象,16,3.1.2,对象,1.,声明对象,类 对象,2.,创建实例,对象,= new,类的构造方法(,参数列表,),例如:,MyDate,d,;,/,声明,d,是,MyDate,类的一个对象,例如:,d=new,MyDate,(),;,/,创建类,MyDate,的一个实例赋值给对象,d,MyDate,d=new,MyDate,();,/,声明对象,创建实例并赋值,说明:,声明对象仅仅说明了对象所属的类,必须通过赋值才能,使对象获得实例。,17,3.,引用对象的成员变量和调用成员方法,对象,.,成员变量,对象,.,成员方法(,参数列表,),例如:,d.year,=2008,;,/,引用成员变量,d.set(2009,7,28);,/,调用成员方法,3.1.2,对象,注意:,Java,的内存自动管理机制,能够跟踪存储单元的使用情况,,自动收回不再被使用的资源,所以,程序中不需要释放对象,占用的空间资源。,18,3.1.2,对象,【,例,3.1,】,声明日期类及使用日期对象。,声明,MyDate,类,,演示,类的声明格式、创建对象、引用对象,成员变量、调用对象成员方法等。,19,4.,对象的引用模型,3.1.2,对象,Java,的,类是引用数据类型,,两个对象之间的赋值是,引用赋值,,,对象赋值过程中,没有创建新的实例,。,图,3.1,对象的引用模型,20,3.1.2,对象,4.,对象的引用模型,图,3.1,对象的引用模型,21,3.1.2,对象,5.,对象的关系运算与比较相等,图,3.2,对象比较引用与比较实例值是否相等,使用关系运算符,=,、,!=,可比较两个对象是否引用同一个实例。,其它关系运算符,、,、,=,不能用于比较对象,,,Java,不支持,C+,的运算符重载功能。,22,3.1.2,对象,5.,对象的关系运算与比较相等,图,3.2,对象比较引用与比较实例值是否相等,一般情况下,两个对象相等是,指它们引用的两个实例的各成员变量值分别对应相等,。,Java,约定一个类的,equals(),方法用于比较该类的两个对象是否相,等。,23,3.2,类的封装性,类的封装性(,encapsulation,)的含义:,1.,将数据和对数据的操作组合起来构成类,,对象是一个不可分割的独立单位;,2.,实现信息隐藏,类既要提供与外部联系的方法,,又要尽可能地隐藏实现细节。,类的使用者,需要知道“做什么”,,包括有哪些类、每个类的特点、每个类提供了哪些常量、成员变量和成员方法等,而不需要知道方法实现的细节。,类的设计者,需要知道“怎样做”,,要考虑类怎样定义、类中有哪,些数据和方法、它们的访问控制权限、方法如何实现等问题。,24,3.2,类的封装性,3.2.1,构造方法,3.2.2,this,引用和,instanceof,对象运算符,3.2.3,访问控制,3.2.4,静态成员,3.2.5,析构方法,3.2.6,浅拷贝与深拷贝,25,3.2.1,构造方法,类的构造方法,(,constructor,),用于创建类的一个实例并对实例的成员变量进行初始化。,1.,声明及调用构造方法,构造方法,与类中,成员方法,的,不同,之处,:,构造方法与类同名;构造方法通过,new,运算符调用。,一个类,可以声明多个构造方法,对成员变量进行不同需求的初始化;,构造方法,不需要写返回值类型,,因为它返回的就是该类的一个实例。,26,构造方法和成员方法的不同之处,A.,作用不同:,成员方法实现对类中成员变量的操作;构造方,法用于创建类的实例并对实例的成员变量进行,初始化。,B.,调用方式不同:,成员方法通过对象调用;构造方法通过,new,运算符调用。,3.2.1,构造方法,27,例如:,public class,MyDate,public,MyDate,(,int,y,int,m,int,d),/,声明构造方法,初始化成员变量,year=y;,month=m;,day=d;,使用,new,运算符调用自定义的构造方法,,参数必须符合构造方法的声明。,例如:,MyDate,d=new MyDate(2009,7,18);,/,创建实例并初始化成员变量,3.2.1,构造方法,28,2.,默认构造方法,A.,当一个类,没有声明构造方法,时,,Java,自动,为该类,提供一个无参,数的默认构造方法,,,对各成员变量按其数据类型进行初始化,。,整数、浮点数、字符、布尔和引用数据类型的初值分别为,0,、,0.0,、,u0000,、,false,和,null,。,B.,当一个类,声明了构造方法,,,Java,不再提供默认,构造方法。,C.,一个类需要声明,默认构造方法为成员赋默认值,。,3.2.1,构造方法,例如:,public,MyDate,( ),/,默认构造方法,year=1970;,month=1;,day=1;,29,3.2.1,构造方法,3.,拷贝构造方法,一个类的构造方法,,如果其参数是该类对象,,称为,拷贝构造方法,,它将创建的新对象初始化为形式参数的实例值,实现对象复制功能。,Java,不提供,默认拷贝构造方法。,例如:,public,MyDate,(,MyDate,d ),/,拷贝构造方法,创建新实例,值同参数实例,year=,d.year,;,month=,d.month,;,day=,d.day,;,调用语句如下:,MyDate,d1=new MyDate(2009,7,16);,MyDate,d2=new MyDate(d1);,/,调用拷贝构造方法复制实例,MyDate,d2=new,MyDate,();,/,创建实例,默认日期值为,(1970,1,1),d2.set(d1);,/,以,d1,对象引用的实例值设置,d2,引用的实例,30,3.2.1,构造方法,4.,构造方法重载,Java,支持构造方法重载,,重载的构造方法提供创建实例时的多种初始化方案,如指定若干参数的构造方法、默认构造方法、拷贝构造方法等。,由于,Java,不支持会产生歧义的参数默认值,,这些构造方法必须重载,,参数列表必须不同,。,31,3.2,类的封装性,3.2.1,构造方法,3.2.2,this,引用和,instanceof,对象运算符,3.2.3,访问控制,3.2.4,静态成员,3.2.5,析构方法,3.2.6,浅拷贝与深拷贝,32,3.2.2,this,引用和,instanceof,对象运算符,1. this,引用,Java,类中的每个成员方法都可以使用代词,this,引用调用,该方法的当前对象自己。,(1),指代对象本身,this,用于指代调用成员方法的当前对象自身。,this,(2),访问本类的成员变量和成员方法,通过,this,引用当前对象的成员变量,调用当前对象的成员方法。,this .,成员变量,this .,成员方法,(,参数列表,),33,3.2.2,this,引用和,instanceof,对象运算符,1. this,引用,例如:,public,boolean,equals (,MyDate,d),/,比较当前日期值与,d,是否相等,/ this,指代调用当前方法的对象,return this=d | d!=null &,this.year,=,d.year,&,this.month,=,d.month,&,this.day,=,d.day,;,一个成员方法中,若没有与成员变量同名的局部变量或形式参数,则,this,引用可以省略,。,当局部变量或形式参数与成员变量同名时,方法体中,默认的是局部变量或形式参数,,而要访问成员变量必须使用,this,引用。,34,3.2.2,this,引用和,instanceof,对象运算符,(3),调用本类重载的构造方法,1. this,引用,this,引用还可用在重载的构造方法中,调用本类已定义,的构造方法。,this,(,参数列表,),35,3.2.2,this,引用和,instanceof,对象运算符,public,MyDate,(,int,year,int,month,int,day ),/,指定参数的构造方法,参数与成员变量同名,this.year,=year;,/,this.year,指当前对象的成员变量,,year,指参数,this.month,=month;,/this,引用不能省略,this.day,=day;,public,MyDate,(),/,默认构造方法,重载,this(1970,1,1);,/,调用本类已定义的构造方法,public,MyDate,(,MyDate,d ),/,拷贝构造方法,this (,d.year,d.month,d.day,);,36,3.2.2,this,引用和,instanceof,对象运算符,2.,instanceof,对象运算符,对象运算符,instanceof,判断一个对象是否属于指定类及,其子类,,返回,boolean,类型。,MyDate,d=new,MyDate,( );,d,instanceof,MyDate,/,返回,true,,,d,是,MyDate,类的实例,37,3.2,类的封装性,3.2.1,构造方法,3.2.2,this,引用和,instanceof,对象运算符,3.2.3,访问控制,3.2.4,静态成员,3.2.5,析构方法,3.2.6,浅拷贝与深拷贝,38,3.2.3,访问控制,在,C/C+,语言中,一个全局变量能被当前文件中的任何函数所修改,产生函数副作用,导致程序运行的不确定性。全局变量是导致软件维护困难的一个重要因素。,Java,不支持类之外的全局变量。同样,一个对象的成员变量和成员方法,如果没有限制,能被其他任何类访问,那么软件维护也将异常困难。,Java,为类及其成员提供公有、保护、缺省和私有等,多级访问控制权限,,用于声明该类或成员能被其他哪些类访问的范围,实现,信息分级隐藏技术,。,39,一个源程序文件中可以声明多个类,但用,public,修,饰的类,只能有一个,,且该,类名必须与文件名相同,。,声明一个类可使用的权限修饰符只有两种:,public,和 缺省,3.2.3,访问控制,1.,类的访问控制权限,公有权限,public,,,可被所有类访问;,缺省权限无修饰符,,可被当前包,(,当前文件夹,),中的类访问。,源程序文件,MyDate.java,中可声明多个类如下:,public class,MyDate,/,公有权限的类,class,MyDate_ex,/,缺省权限的类,40,2.,类中成员的访问控制权限,类的成员有,4,种访问控制权限:,public,声明,公有成员,,该成员,可被所有类访问,。,protected,声明,保护成员,,该成员,能被当前类及其子类、或,当前包中的其他类访问,,也称,在子类中可见,。,3.2.3,访问控制,private,声明,私有成员,,该成员,仅能被当前类的成员访问,。,缺省,没有修饰符表示,缺省权限,,说明该成员,能被当前类以及,当前包中的其他类访问,,也称,在当前包中可见,。,41,权限修饰符,当前类,当前包,其他包的子类,所有类,private,(,私有,),缺省,protected,(,保护,),public,(,公有,),表,3-1,类中成员的,4,级访问控制权限及范围,3.2.3,访问控制,private,权限,将访问控制的最小范围限制在一个类中,,缺省权限,将访问范围扩大至当前包,,protected,再将范围扩大至子类,,public,指定最大范围。,42,3.,声明,set(),和,get(),方法存取对象的属性,3.2.3,访问控制,对象的属性,指对象的某个特性或特征。,对象可以有多个属性,各属性的数据类型可不同;不同,的对象具有不同的属性。,例如:,MyDate,类声明,year,、,month,、,day,成员变量表示年月日属性,但三个,整数合起来构成的不一定是日期。,d.month,=13;,/,没有语法错误,却造成逻辑错误,Mydate,类必须将成员变量设计为私有权限如下,只有,MyDate,类自己能够对,其成员变量进行操作,保证日期有效。,private,int,year, month, day;,/,私有的成员变量,MyDate,类必须声明若干公有成员方法,提供获得和设置各种属性的功能。,43,3.,声明,set(),和,get(),方法存取对象的属性,3.2.3,访问控制,Java,约定,存取对象属性的方法分别是,set(),和,get(),。,public void set (,int,y,int,m,int,d),/,设置日期值,public void set (,MyDate,d),/,设置日期值,重载,public,int,getYear,(),/,获得年份,public,int,getMonth,(),/,获得月份,public,int,getDay,(),/,获得当月日期,44,3.2,类的封装性,3.2.1,构造方法,3.2.2,this,引用和,instanceof,对象运算符,3.2.3,访问控制,3.2.4,静态成员,3.2.5,析构方法,3.2.6,浅拷贝与深拷贝,45,实例成员,属于,对象,,包括,实例成员变量,和,实例成员方法,。,只有,创建了实例,,才能,通过对象访问,实例成员变量和调用,实例成员方法。,静态成员,属于,类,,需要用关键字,static,标识。包括,类成员变量,和,类成员方法,。,即使没有创建实例,也可以,通过类名直接访问,静态成员变量,和调用静态成员方法。,3.2.4,静态成员,例如:,Java,在,Math,类中声明静态成员常量,PI,表示,,声明如下,引用格式,为,Math.PI,.,public static final double PI=3.14159265358979323846;,/ Math,类声明静态成员常量,PI,表示,46,在类内部,可直接访问静态成员,省略类名。静态成员也可以通过对象引用。在静态成员方法体中,不能访问实例成员,不能使用,this,引用。,在声明时,可对静态成员变量赋初值,也可使用,static,声明静态初始化块,对静态成员变量进行初始化。格式如下,其中只能访问类中的静态成员,且不能引发检测性异常,并在类加载时执行。,3.2.4,静态成员,Static /,静态初始化块,静态成员变量初始化;,注意:,关键字,static,在,Java,中的含义与在,C/C+,中的含义有所差别;,在,Java,中,不能声明方法的局部变量为,static,。,47,【,例,3.2,】,封装的日期类。, 实例成员与静态成员,演示类的封装性。,对例,3.1,中的,MyDate,类进行封装,包括设计并重载构造方,法,为成员变量和成员方法设置访问控制权限,使用,this,引用,增强程序的可维护性,声明静态成员等。,3.2.4,静态成员,图,3.3,实例成员变量与静态成员变量的存储结构不同,48, 修改实例与返回对象, 日期类的设计问题讨论, 类封装的优点,3.2.4,静态成员,【,例,3.2,】,封装的日期类。,49,3.2,类的封装性,3.2.1,构造方法,3.2.2,this,引用和,instanceof,对象运算符,3.2.3,访问控制,3.2.4,静态成员,3.2.5,析构方法,3.2.6,浅拷贝与深拷贝,50,3.2.5,析构方法,类的析构方法,(destructor),用于释放实例并执行特定操作。,Java,的,内存自动管理机制,能够释放不再将被使用的对象,。,所以,通常类不需要设计析构方法。,如果需要在释放对象时执行特定操作,则类可以声明析构方法。,public void finalize( ),/,约定析构方法名为,finalize,/,finalize(),方法没有参数,也没有返回值,语句序列;,/,一个类只能有一个,finalize(),方法,且,finalize(),不允许重载,51,析构方法,注意:,A.,当对象超出它的作用域时,,Java,将执行对象的析构方法。,B.,一个对象也可以调用析构方法释放对象自己。,C.,不能使用已被析构方法释放的对象,否则将产生运行错误。,3.2.5,析构方法,例如:,d.finalize,();,/,调用对象的析构方法,52,3.2,类的封装性,3.2.1,构造方法,3.2.2,this,引用和,instanceof,对象运算符,3.2.3,访问控制,3.2.4,静态成员,3.2.5,析构方法,3.2.6,浅拷贝与深拷贝,53,3.2.6,浅拷贝与深拷贝,浅拷贝,一个类的拷贝构造方法,使用一个已知实例,对新创建实例的成员变量逐个赋值,这种方,法称为浅拷贝。,当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。,例如:,MyDate,d2=new MyDate(d1),;,图,3.4,浅拷贝,54,3.2.6,浅拷贝与深拷贝,当对象的成员变量是引用数据类型时,浅拷贝不能实现对象复制功能,需要深拷贝。,public class Person,String name;,/,姓名,MyDate,birthday;,/,生日,public Person (String name,MyDate,birthday),/,构造方法,this.name,= name;,this.birthday,=birthday;,/,引用赋值,public Person (Person p),/,拷贝构造方法,复制对象,this (,p.name,p.birthday,);,55,3.2.6,浅拷贝与深拷贝,调用以下构造方法:,Person p1 = new Person(“,李小明”,,new MyDate(1979,3,15);,Person p2 = new Person(p1);,/,拷贝构造方法,p2.birthday.tomorrow();,/,同时改变,p1,引用的实例值,p2.birthday= new MyDate(p1.birthday);,/,将生日属性设置为新创建实例,图,3.5,当成员变量是引用类型时,深拷贝才能复制实例,56,3.2.6,浅拷贝与深拷贝,【,例,3.3,】,使用对象作为成员变量并实现深拷贝的,Person,类。,深拷贝,当一个类包含引用类型的成员变量时,该类的拷贝构造,方法,,不仅要,复制对象的所有非引用成员变量值,,还要,为引用类型的成员变量创建新的实例,并初始化为形式,参数实例值,这种复制方法称为深拷贝。,由于,String,是常量字符串类型,当改变一个字符串对象时,自动创建一个新的字符串实例。,57,3.3,类的继承性,3.3.1,由继承派生类,3.3.2,继承原则及作用,3.3.3,子类的构造方法,继承,(inheritance),是面向对象的重要概念之一,它提供在已有类,的基础上创建新类的方式,是构造可复用软件的有效机制。,58,3.3.1,由继承派生类,1.,继承的概念,继承,(,inherit,),:根据一个已知的类由继承方式创建一个类,使新,创建的类自动拥有被继承类的全部成员。,父类,/,超类,被继承类;,子类,/,派生类,通过继承产生的新类。,父类和子类的关系:,A.,子类,自动拥有,父类的全部成员,包括成员变量和方法等,,使父类成员得以传承和延续;,B.,子类可以,更改,从父类继承来的成员,使父类成员适应新的,需求;,C.,子类也可以,增加,自己的成员,使类的功能得以扩充。,D.,但是,子类,不能删除,父类的成员。,59,2.,声明继承的类,修饰符,class,类, ,extends,父类, ,implements,接口列表,注意:,Java,的类是单继承的,一个类只能有一个父类,不能有,多个父类。,3.3.1,由继承派生类,【,例,3.4,】,Student,类继承,Person,类。,演示类的继承关系以及继承原则。,60,1.,继承原则,3.3.2,继承原则及作用,(1),子类继承父类的成员变量,子类,继承父类所有的成员变量,包括,实例成员变量,和,静态成,员变量,。,(2),子类继承父类除构造方法以外的成员方法,子类继承父类,除构造方法以外,的成员方法,包括,实例成员方,法,和,静态成员方法,。子类能够继承父类的析构方法。通过子类对,象可以调用从父类继承来的成员方法。,61,1.,继承原则,(3),子类不能继承父类的构造方法。,子类没有继承父类的构造方法,因为父类的构造方法只能创,建父类实例并初始化,无法创建子类实例。,3.3.2,继承原则及作用,(4),子类可以增加成员,可以重定义从父类继承来的成员,但,不能删除它们。,例如:,父类声明构造方法,Person (,String,MyDate,),当子类没有声明,Student (,String,MyDate,),构造方法时,下列语句错误:,Student s1 = new Student (“,李小明”,,new MyDate(1979,3,15);,/,语法错,构造方法参数不匹配,62,2.,继承的作用,继承,在父类与子类之间建立了联系:,子类对象即是父类对象,子类自动拥有父类的全部成员,包括成员变量和成员方法等,使父类成员得以传承和延续;,子类不能删除但可以更改从父类继承来的成员,使父类成员适应新的需求;,子类也可以增加自己的成员,使类的功能得以扩充。,3.3.2,继承原则及作用,63,2.,继承的作用,3.3.2,继承原则及作用,祖先类,后代类:,具有继承关系的、相距多个层次的类。,父类,直接祖先类,Java,只允许类之间的,单继承,,单继承方式下:,父类和子类是,一对多,的关系,由此形成具有,树形结构,的类的,层次体系。,Java,约定该树的根是,Object,类。,64,3.3.2,继承原则及作用,65,2.,继承的作用,继承,是实现,软件重用,的重要措施,增强了,软件的可扩充,能力,,提高了,软件的可维护性,。,祖先类中,设计,通用性的功能,;,后代类中,设计,特殊性的功能,。,3.3.2,继承原则及作用,66,3. Object,类,Object,类,定义了所有对象都具有的基本状态和行为,,它没有成员变量。,当一个类没有声明,父类时,,Java,默认该类的父类是,Object,。,所有类都是,Object,的子类,,都从,Object,类继承了,equals(),和,toString,(),等,方法。,3.3.2,继承原则及作用,public class Object, public Object(),/,构造方法,public String,toString,(),/,返回描述当前对象的字符串,public,boolean,equals(Object,obj,),/,比较当前对象与,obj,是否相等,protected void finalize() throws,Throwable,/,析构方法,67,4.,子类对父类成员的访问权限,虽然子类继承了父类的所有成员,但,并不是对所有成员,都有访问权限,。访问权限说明如下:,(1),子类不能访问父类的私有成员,(private),。,子类不能访问父类声明为私有的成员变量和成员方法。,(2),子类能够访问父类的公有成员和保护成员,。,(3),子类对父类的,缺省权限成员的访问控制,,,以包为界,分两种,情况:,可以访问,当前包中父类的缺省权限成员,,,不能访问,其他包中父类的缺省权限成员,。,3.3.2,继承原则及作用,68,4.,子类对象对父类成员的访问权限,类中成员的,访问控制权限体现封装的,信息隐藏原则:,如果,仅限于本类使用,,则声明成员为,private,;,如果可被,子类使用,,则声明成员为,protected,;,如果希望被,所有类访问,,则声明成员为,public,。,3.3.2,继承原则及作用,69,3.3.3,子类的构造方法,子类对象包含从其父类继承来的成员变量,以及,子类声明的成员变量,子类构造方法必须对这些成员,变量进行初始化。而父类构造方法已对父类声明的成员,变量进行了初始化,因此,子类构造方法必须调用父类,的某一个构造方法。,70,3.3.3,子类的构造方法,1.,使用,super(),调用父类构造方法,super,(,参数列表,),在子类的构造方法体中,可以,使用“,super,引用”,调用父类的构造方法,。其语法格式如下:,public Student (String name,MyDate,birthday, String spec),/,构造方法,super (name, birthday);,/super(),调用必须是第一条语句,,调用父类同参数的构造方法,this. speciality,= spec;,71,2.,默认执行,super(),(1),当一个类没有声明构造方法时,,Java,为该类提供默认构造,方法,调用,super(),执行父类无参数的构造方法。,以下两种情况下,,Java,默认执行,super(),,调用父类的构造方法。,Public Student(),/Java,提供的默认构造方法,super(),;,/,调用父类构造方法,Person(),例如:,Student s1=new Student();,3.3.3,子类的构造方法,72,2.,默认执行,super(),如果父类,Person,没有声明,构造方法,Person(),,则上述语句,产,生编译错误,。因此,,每个类都要声明无参数的构造方法,,即使,自己不用,也要为子类准备着。,Public Person(),/Java,提供的默认构造方法,super(),;,/,调用父类构造方法,Object(),3.3.3,子类的构造方法,73,2.,默认执行,super(),(2),如果子类的构造方法没有调用,super(),或,this(),,,Java,将默认执,行,super(),。,3.3.3,子类的构造方法,Public Student(),super(),;,/Java,默认调用,speciality=“”;,74,3.4,类的多态性,3.4.1,子类重定义从父类继承来的成员,3.4.2,类型的多态,3.4.3,编译时多态和运行时多态,3.4.4,多态的方法实现,提供类中,方法,设计的灵活性,和,执行的多样性,75,多态性,指一个方法可以有多种实现版本,,即“一种定义,多种实现”。,例如:,+1,/,正,单目运算,1+2,/,加法运算,双目运算,操作数是数值,“,1”+“2”,/,字符串连接运算,双目运算,操作数是字符串,类的多态性表现为,方法的多态,和,类型的多态,。,方法的多态:,包括方法的重载和覆盖,为一种功能提供多种实现。,类型的多态:,子类是一种父类类型。,3.4,类的多态性,76,3.4.1,子类重定义从父类继承来的成员,当子类从父类继承来的成员不能满足子类需要时,子类不能,删除它们,但可以重定义它们,扩充父类成员方法的功能,使父,类成员能够适应子类新的需求。,子类,重定义,父类成员包括:,重定义父类的成员变量,则,隐藏,父类的成员变量;,重定义父类的成员方法,,如果参数列表相同,,则,覆盖,父类的,成员方法,,否则,重载,。,子类重定义父类成员,表现出,多态性,,父类对象引用父类成员,子类对象引用子类成员。重定义的同名成员之间不会产生冲突和混乱。,77,3.4.1,子类重定义从父类继承来的成员,super.,成员变量,/,当子类隐藏父类成员变量时,引用父类同名成员变量,super.,成员方法(,参数列表,),/,当子类覆盖父类成员方法时,,调用父类同名成员方法,在子类的成员方法中,如果需要引用,被子类隐藏或覆盖的父类同名成员,,可使用,super,引用。格式如下:,78,3.4.1,子类重定义从父类继承来的成员,子类隐藏父类成员变量,:count,子类覆盖父类成员方法,howMany,( ),、,toString,( ),、,finalize( ),子类继承并重载父类成员方法,:set( ),【,例,3.5,】,Student,类重定义从父类继承来的成员。,声明,Student,类重定义从父类,Person,继承来的某些成员,变量和成员方法。,79,3.4.1,子类重定义从父类继承来的成员,子类隐藏父类成员变量,:count,子类覆盖父类成员方法,howMany,( ),、,toString,( ),、,finalize( ),子类继承并重载父类成员方法,:set( ),【,例,3.5,】,Student,类重定义从父类继承来的成员。,声明,Student,类重定义从父类,Person,继承来的某些成员,变量和成员方法。,80,3.4.2,类型的多态,子类通过继承方式扩充和发展了它的父类,继承约定了子类与父类之间存在的,isA,关系,子类是父类的一种特殊类型。,例如:,Student,类,Person,类,isA,关系,isA,关系与,hasA,关系不同,,hasA,关系,表示一个对象使用另一个对象来存储自身的状态。,例如:,Person,类,MyDate,类,hasA,关系,一个,Person,对象中有一个,MyDate,对象表示生日属性,Person,对象通过,birthday,成员变量引用一个,MyDate,对象。,81,3.4.2,类型的多态,1.,子类对象即是父类对象,子类对象包含了父类的所有成员变量,,isA,关系表现为继承具有,“即是”性质,:子类对象即是父类对象。反之不然,父类对象不是它的子类对象。,使用对象运算符,instanceof,可以判断一个对象是否属于指定类及其子类。,例如:,new Person(),instanceof,Person,/,结果是,true,new Student(),instanceof,Person,/,结果是,true,子类对象即是父类对象,new Person(),instanceof,Student,/,结果是,false,父类对象不是子类对象,82,3.4.2,类型的多态,2.,父类对象引用子类实例,子类对象即是父类对象,表现为父类与子类之间具有赋值相容性,即,父类对象能够引用子类实例,,反之不行。,例如:,Person p=new Student();,/,赋值相容,子类对象即是父类对象,Student s=new Person();,/,语法错,赋值不相容,父类对象不是子类对象,再扩展到,Object,类,由于所有类都是,Object,的子类,所以,,一个,Object,对象能够引用任何类的实例,。,例如:,Object,obj,=new Person();,/,赋值相容,子类对象即是父类对象,83,3.4.2,类型的多态,即是性质也,表现在方法调用的参数传递过程中,。,例如:,public,int,olderThen(Person,p),p1.olderThen(s1),/,父类对象调用本类方法,参数为子类对象,s1.olderThen(p1),/,子类对象调用父类方法,参数为父类对象,s2.olderThen(s1),/,子类对象调用父类方法,参数为子类对象,84,3.4.3,编译时多态和,运行时多态,1.,编译时多态性,对于多个同名方法,如果,在编译时能够确定执行同名,方法中的哪一个,,则称为,编译时多态性,。,方法的重载,都是编译时多态性。,方法的覆盖,表现出两种多态性,当对象,引用本类实例时,,,为编译时多态性;,否则,为运行时多态性。,85,Person p1=new Person(“,李小明”,new MyDate(1979,3,15),;,/,对象引用本类实例,System.out.println(“p1:”+p1.toString();,/,编译时多态性,执行,Person,类的,toString,(),Student1 s1=new Student(p1,“,计算机”,);,System.out.println(“s1:”+s1.toString();,/,编译时多态性,执行,Student,类的,toString,(),当对象,获得本类实例时,,为,编译时多态性,;,例如,:,3.4.3,编译时多态和,运行时多态,86,2.,运行时多态性,3.4.3,编译时多态和,运行时多态,如果,在编译时不能确定、,只有,在运行时才能确定,执行多个,同名方法中的哪一个,则称为,运行时多态性,。,以下声明父类对象,p2,引用子类实例:,Person p2=new Student(“,张小莉”,new MyDate(1989,1,15),;,/,父类,对象引用子类实例,System.out.println(“p2:”+p2.toString();,/,执行,Student,类的,toString,(),父类对象只能执行那些,在父类中声明、被子类覆盖了的子类,方法,,如,toString,(),,,不能执行子类增加的成员方法。,p2.set(“,张小莉”,new MyDate(1989,1,15),,“计算机,”),;,/,语法错,,Person,类没有声明该方法,p2.setSpeciality,(“,电子信息”);,/,语法错,,Person,类没有声明该方法,87,3.4.3,编译时多态和,运行时多态,程序运行时,,Java,从实例所属的类开始寻找,匹配的方法执行,如果当前类中没有匹配方法,则沿着继承关系逐层向,上,依次在父类或各祖先类中寻找匹配方法,直到,Object,类。,图,3.8,寻找,p2.toString(),匹配执行方法,88,3.4.4,多态的方法实现,从类的,使用者角度看,,方法的多态性,使一个功能具有统一风格,,,不仅在一个类中,也在父类与多个子类之间具有相同的约定。,从类的,设计者角度看,,类的继承性和多态性使类,易于扩充功能,,增强了软件的可维护性。,1.,多态的,toString,(),方法,public String,toString,(),/,返回由当前对象所属类名和十六进制的哈希码组成的描述对象信息的字符串,return,getClass.getName()+“”+Integer.toHexString(hasCode,();,89,3.4.4,多态的方法实现,2.,多态的,equals(),方法,public,boolean,equals (Object,obj,),/,比较两个对象是否相等,比较的是两个对象是否引用同一个实例。,return this=,obj,;,90,3.4.4,多态的方法实现,【,例,3.6,】,在对象数组中查找。,演示运行时多态的应用,以及对象数组、对象作为方法,参数及返回值的设计方法。,对象数组及计数,运行时多态性体现,System.out.println,(,pgroupi,.,toString,();,图,3.9,对象数组保存,Person,及其子类对象,上机思考题,91,3.5,类的抽象性,3.5.1,用继承刻画包含关系,3.5.2,抽象类,3.5.3,最终类,现实世界中的,实体,抽象为,问题域的类,,,用,对象,表达,实体的属性和操作,,,用,类与类之间的关系,表达,实体间的关系,,还可以描述,抽象概念中的约定。,92,3.5.1,用继承刻画包含关系,图,3.10,多种图形间的包含关系,93,3.5.1,用继承刻画包含关系,采用面向对象思想设计软件系统的普遍规律:,先进行,需求分析,建立对象及其关系模型,,再用,面向对象语言的类描述并实现,所设计的多个类及其层次,关系与分析阶段建立的对象及其关系模型一致。,声明“图形抽象类”,,约定抽象图形概念中的属性和行为,抽象类没有实力,就像画不出一种没有具体形状的图形一样。,声明“闭合图形抽象类”继承“图形抽象类”,,增加计算周长和面积方法等。,声明椭圆类继承闭合图形抽象类,,增加椭圆的半径属性,实现计算椭圆的周长和面积等功能。,声明矩形类继承闭合图形抽象类,,增加矩形的长度、宽度属性,实现计算矩形的周长和面积等功能。,94,1.,声明抽象类与抽象方法,抽象类,使用关键字,abstract,声明的类,.,抽象方法,使用关键字,abstract,声明的成员方法,.,只有方法声明而没有方法体的成员方法,.,public abstract class,ClosedFigure,/,闭合图形抽象类,public abstract double area();,/,计算面积,抽象方法,抽象方法,:,有访问修饰词、,返回值类型、方法名和,参数列表,,无方法体,3.5.2,抽象类,95,2.,抽象类的特点,ClosedFigure,g=new,ClosedFigure,();,/,语法错,抽象类不能被实例化,3.5.2,抽象类,注意,:,抽象类中,可以不包含,抽象方法,但是,包含抽象方法的类,必须被声明为,抽象类,.,构造方法,静态成员方法,不能被声明为抽象方法,.,一个,非抽象类,必须实现,从父类继承来的,所有抽象方法,,,如果不能实现,父类的所有抽象方法,,则,该类,必须声明为抽象类,。,抽象类,不能被实例化,不能创建抽象类的实例。,96,3.,抽象类与抽象方法的作用,抽象类,用于描述抽象的概念,其中,声明的抽象方法,为多个子类,约定方法声明,,每个子类可以根据自身的实际情况,,给出抽象方法的具体实现,显然,不同的子类可以有不,同的方法实现,。,抽象方法,用于,声明,方法的参数和返回值,具体实现,由抽象类,的子类完成,子类必须,覆盖,父类的抽象方法,.,提供,方法声明与方法实现的,分离机制,,使得抽象类的,多个,不同的子类,能够,表现出共同的行为能力,.,3.5.2,抽象类,97,图,3.11,用继承刻画多种图形间的包含关系,3.5.2,抽象类,98,【,例,3.7,】,闭合图形抽象类及其子类。,演示抽象类与抽象方法的作用。,声明抽象闭合图形类,ClosedFigure,,其中包含,perimeter(),和
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!