欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:6509661       资源大小:2.60MB        全文页数:101页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    基本概念,面向过程的程序设计思想:在解决问题的时候,从问题的每个细节入手来展开系统流程,比较适用于解决简单的问题。“面向过程”是一种以事件为中心的编程思想。它并不关心整体,而是关心整体中的每个细节。,面向对象的程序设计(Object Oriental Programming,OOP)思想:最近十年发展起来的程序设计模式,其目标是将软件系统待处理问题或者事务抽象为对象(Object),由于对象本身具有一定的特征和行为,因此可以通过对象间的消息传递的方式驱动对象的动作,进而实现软件系统的功能。,基本概念,类是数据和对数据操作的封装体。类具有封装性、继承性、多态性和抽象性;这些特性提供软件复用机制,增强软件的扩充能力,提高软件的可维护性。,Java的面向对象机制从C+发展而来:完善了C+类的封装、继承、多态和抽象等基本概念;放弃了C+的多重继承、友元类和运算符重载等易产生歧义且安全性差的诸多特性;采用单重继承+接口的方式实现多重继承功能,提供内存自动管理和异常处理机制。,第3章 类的封装、继承和多态,3.1 类和对象3.2 类的封装性3.3 类的继承性3.4 类的多态性3.5 类的抽象性,面向对象程序设计思想:将数据域和对数据的操作合 起来作为一个整体进行设计。对象具有属性和行为能力的实体。对象参与软件运行,多种对象合作完成预定任务。类一组对象的数据类型,是创建对象的模板。,3.1 类和对象,面向对象程序设计,就是把现实对象及其关系抽象 为问题域的类及其关系,用程序设计语言设计类,再创建对象实现指定功能。,3.1 类和对象,3.1.1 类3.1.2 对象,1.声明类 2.声明成员变量和成员方法 3.成员方法重载,3.1.1 类,类(class),类是数据以及对数据的一组操作的封装体。,成员变量类中的数据,反映类的状态和特征;成员方法类中对数据的操作,表示类的行为能力。,类的成员类中的成员变量和成员方法的统称。,注意:与数据类型相似,类是只定义数据及对数据操作的模板,类本身并不真正参与程序运行,实际参与程序运行的是类 的对象。,3.1.1 类,3.1.1 类,类声明的格式:,类声明 成员变量的声明;成员方法的声明及实现;,类声明定义该类的名称、访问权限、与其他类的关系等。,成员方法用来描述对成员变量进行的操作,不但要声明方 法,还要实现方法。,1.声明类,必须项关键字class和自定义的类名;可选项方括号中的;,、合法的Java标识符类名标识符Java预定通常首字母大写。,说明类属性的关键字,如public访问权限、abstract 抽象类、final最终类等。,3.1.1 类,修饰符 class 类 extends 父类implements 接口列表,类的参数,带参数的类称为泛型类。,2.声明成员变量和成员方法,3.1.1 类,修饰符 数据类型 变量=表达式,变量=表达式;,成员变量声明格式:,一些说明成员属性的关键字,包括访问权限public、protected、private以及静态成员static、最终方法和 最终变量final等。,3.1.1 类,成员方法用来描述对成员变量进行的操作。格式如下:,修饰符 返回值类型 方法(参数列表)throws 异常类 语句序列;return 返回值;,2.声明成员变量和成员方法,一些说明成员属性的关键字,包括访问权限public、protected、private以及静态成员static、最终方法和 最终变量final等。,例如: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 类,3.成员方法重载,一个类中成员变量不能同名,但成员变量与成员方法可以同名。,3.1.1 类,重载:一个类中可以有多个同名的成员方法,前提是参数列表必须 不同,称为类的成员方法重载。重载的作用:重载多个方法为一种功能提供多种实现;重载方法的区别:必须以不同的参数类型、参数个数、参数的次序 来区别。,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)/重载方法,参数的数据类型不同,重载的执行:编译时,根据方法实际参数的数据类型、个数和次 序,决定究竟应该执行重载方法中的哪一个。,注意:如果两个方法的参数列表相同但返回值类型不同,则不是 重载,将产生编译错误。,3.1 类和对象,3.1.1 类3.1.2 对象,类是用于定义数据及对数据操作的构造数据类型,类本身不能参与程序运行,实际参与程序运行的是类的对象。,对象(object),对象(object)是类的实例(instance),即类的取值。类的一个对象能够获得并保存类的一个实例。,类比:类对象类的实例 数据类型变量取值例如:int类型变量i取值10,对象是动态的,每个对象都有自己的生存周期,都会经历 一个从创建、运行到消亡的变化过程。任何一个对象都有其所属的类。使用对象首先需要声明对象 所属的类,再使对象获得一个类的实例,引用对象的成员变 量和调用对象的方法,使用完后释放对象。,3.1.2 对象,3.1.2 对象,1.声明对象,类 对象,2.创建实例,对象=new 类的构造方法(参数列表),例如:MyDate d;/声明d是MyDate类的一个对象,例如:d=new MyDate();/创建类MyDate的一个实例赋值给对象d MyDate d=new MyDate();/声明对象,创建实例并赋值,说明:声明对象仅仅说明了对象所属的类,必须通过赋值才能 使对象获得实例。,3.引用对象的成员变量和调用成员方法,对象.成员变量对象.成员方法(参数列表),例如:d.year=2008;/引用成员变量 d.set(2009,7,28);/调用成员方法,3.1.2 对象,注意:Java的内存自动管理机制,能够跟踪存储单元的使用情况,自动收回不再被使用的资源,所以,程序中不需要释放对象 占用的空间资源。,3.1.2 对象,【例3.1】声明日期类及使用日期对象。,声明MyDate类,演示类的声明格式、创建对象、引用对象 成员变量、调用对象成员方法等。,4.对象的引用模型,3.1.2 对象,Java的类是引用数据类型,两个对象之间的赋值是引用赋值,对象赋值过程中没有创建新的实例。,图3.1 对象的引用模型,3.1.2 对象,4.对象的引用模型,图3.1 对象的引用模型,3.1.2 对象,5.对象的关系运算与比较相等,图3.2 对象比较引用与比较实例值是否相等,使用关系运算符=、!=可比较两个对象是否引用同一个实例。其它关系运算符、=不能用于比较对象,Java不支持 C+的运算符重载功能。,3.1.2 对象,5.对象的关系运算与比较相等,图3.2 对象比较引用与比较实例值是否相等,一般情况下,两个对象相等是指它们引用的两个实例的各成员变量值分别对应相等。Java约定一个类的equals()方法用于比较该类的两个对象是否相 等。,3.2 类的封装性,类的封装性(encapsulation)的含义:1.将数据和对数据的操作组合起来构成类,对象是一个不可分割的独立单位;2.实现信息隐藏,类既要提供与外部联系的方法,又要尽可能地隐藏实现细节。,类的使用者需要知道“做什么”,包括有哪些类、每个类的特点、每个类提供了哪些常量、成员变量和成员方法等,而不需要知道方法实现的细节。类的设计者需要知道“怎样做”,要考虑类怎样定义、类中有哪 些数据和方法、它们的访问控制权限、方法如何实现等问题。,3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof 对象运算符3.2.3 访问控制3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,3.2.1 构造方法,类的构造方法(constructor)用于创建类的一个实例并对实例的成员变量进行初始化。,1.声明及调用构造方法,构造方法与类中成员方法的不同之处:构造方法与类同名;构造方法通过new运算符调用。,一个类可以声明多个构造方法对成员变量进行不同需求的初始化;构造方法不需要写返回值类型,因为它返回的就是该类的一个实例。,构造方法和成员方法的不同之处,A.作用不同:成员方法实现对类中成员变量的操作;构造方 法用于创建类的实例并对实例的成员变量进行 初始化。B.调用方式不同:成员方法通过对象调用;构造方法通过 new运算符调用。,3.2.1 构造方法,例如: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 构造方法,2.默认构造方法,A.当一个类没有声明构造方法时,Java自动为该类提供一个无参 数的默认构造方法,对各成员变量按其数据类型进行初始化。整数、浮点数、字符、布尔和引用数据类型的初值分别为 0、0.0、u0000、false和null。B.当一个类声明了构造方法,Java不再提供默认构造方法。C.一个类需要声明默认构造方法为成员赋默认值。,3.2.1 构造方法,例如:public MyDate()/默认构造方法 year=1970;month=1;day=1;,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引用的实例,3.2.1 构造方法,4.构造方法重载,Java支持构造方法重载,重载的构造方法提供创建实例时的多种初始化方案,如指定若干参数的构造方法、默认构造方法、拷贝构造方法等。由于Java不支持会产生歧义的参数默认值,这些构造方法必须重载,参数列表必须不同。,3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof 对象运算符3.2.3 访问控制3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,3.2.2 this引用和instanceof 对象运算符,1.this引用,Java类中的每个成员方法都可以使用代词this引用调用该方法的当前对象自己。,(1)指代对象本身,this用于指代调用成员方法的当前对象自身。,this,(2)访问本类的成员变量和成员方法,通过this引用当前对象的成员变量,调用当前对象的成员方法。,this.成员变量this.成员方法(参数列表),3.2.2 this引用和instanceof 对象运算符,1.this引用,例如:public boolean equals(MyDate d)/比较当前日期值与d是否相等/this指代调用当前方法的对象 return this=d|d!=null,一个成员方法中,若没有与成员变量同名的局部变量或形式参数,则this引用可以省略。当局部变量或形式参数与成员变量同名时,方法体中默认的是局部变量或形式参数,而要访问成员变量必须使用this引用。,3.2.2 this引用和instanceof 对象运算符,(3)调用本类重载的构造方法,1.this引用,this引用还可用在重载的构造方法中,调用本类已定义的构造方法。,this(参数列表),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);,3.2.2 this引用和instanceof 对象运算符,2.instanceof 对象运算符,对象运算符instanceof 判断一个对象是否属于指定类及其子类,返回boolean类型。,MyDate d=new MyDate();d instanceof MyDate/返回true,d是MyDate类的实例,3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof 对象运算符3.2.3 访问控制3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,3.2.3 访问控制,在C/C+语言中,一个全局变量能被当前文件中的任何函数所修改,产生函数副作用,导致程序运行的不确定性。全局变量是导致软件维护困难的一个重要因素。Java不支持类之外的全局变量。同样,一个对象的成员变量和成员方法,如果没有限制,能被其他任何类访问,那么软件维护也将异常困难。,Java为类及其成员提供公有、保护、缺省和私有等多级访问控制权限,用于声明该类或成员能被其他哪些类访问的范围,实现信息分级隐藏技术。,一个源程序文件中可以声明多个类,但用public修饰的类只能有一个,且该类名必须与文件名相同。,声明一个类可使用的权限修饰符只有两种:public 和 缺省,3.2.3 访问控制,1.类的访问控制权限,公有权限public,可被所有类访问;缺省权限无修饰符,可被当前包(当前文件夹)中的类访问。,源程序文件MyDate.java中可声明多个类如下:public class MyDate/公有权限的类 class MyDate_ex/缺省权限的类,2.类中成员的访问控制权限,类的成员有4种访问控制权限:,public声明公有成员,该成员可被所有类访问。,protected声明保护成员,该成员能被当前类及其子类、或 当前包中的其他类访问,也称在子类中可见。,3.2.3 访问控制,private声明私有成员,该成员仅能被当前类的成员访问。,缺省 没有修饰符表示缺省权限,说明该成员能被当前类以及 当前包中的其他类访问,也称在当前包中可见。,42,表3-1 类中成员的4级访问控制权限及范围,3.2.3 访问控制,private权限将访问控制的最小范围限制在一个类中,缺省权限将访问范围扩大至当前包,protected再将范围扩大至子类,public指定最大范围。,3.声明set()和get()方法存取对象的属性,3.2.3 访问控制,对象的属性指对象的某个特性或特征。对象可以有多个属性,各属性的数据类型可不同;不同 的对象具有不同的属性。,例如:MyDate类声明year、month、day成员变量表示年月日属性,但三个 整数合起来构成的不一定是日期。d.month=13;/没有语法错误,却造成逻辑错误 Mydate类必须将成员变量设计为私有权限如下,只有MyDate类自己能够对其成员变量进行操作,保证日期有效。private int year,month,day;/私有的成员变量,MyDate类必须声明若干公有成员方法,提供获得和设置各种属性的功能。,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()/获得当月日期,3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof 对象运算符3.2.3 访问控制3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,实例成员属于对象,包括实例成员变量和实例成员方法。只有创建了实例,才能通过对象访问实例成员变量和调用实例成员方法。,静态成员属于类,需要用关键字static标识。包括类成员变量 和类成员方法。即使没有创建实例,也可以通过类名直接访问静态成员变量和调用静态成员方法。,3.2.4 静态成员,例如:Java在Math类中声明静态成员常量PI表示,声明如下,引用格式 为Math.PI.public static final double PI=3.14159265358979323846;/Math类声明静态成员常量PI表示,在类内部,可直接访问静态成员,省略类名。静态成员也可以通过对象引用。在静态成员方法体中,不能访问实例成员,不能使用this引用。,在声明时,可对静态成员变量赋初值,也可使用static声明静态初始化块,对静态成员变量进行初始化。格式如下,其中只能访问类中的静态成员,且不能引发检测性异常,并在类加载时执行。,3.2.4 静态成员,Static/静态初始化块 静态成员变量初始化;,注意:关键字static在Java中的含义与在C/C+中的含义有所差别;在Java中,不能声明方法的局部变量为static。,【例3.2】封装的日期类。,实例成员与静态成员,演示类的封装性。对例3.1中的MyDate类进行封装,包括设计并重载构造方法,为成员变量和成员方法设置访问控制权限,使用this引用增强程序的可维护性,声明静态成员等。,3.2.4 静态成员,图3.3 实例成员变量与静态成员变量的存储结构不同,修改实例与返回对象 日期类的设计问题讨论 类封装的优点,3.2.4 静态成员,【例3.2】封装的日期类。,3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof 对象运算符3.2.3 访问控制3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,3.2.5 析构方法,类的析构方法(destructor)用于释放实例并执行特定操作。,Java的内存自动管理机制能够释放不再将被使用的对象。所以,通常类不需要设计析构方法。如果需要在释放对象时执行特定操作,则类可以声明析构方法。,public void finalize()/约定析构方法名为finalize/finalize()方法没有参数,也没有返回值 语句序列;/一个类只能有一个finalize()方法,且finalize()不允许重载,析构方法,注意:A.当对象超出它的作用域时,Java将执行对象的析构方法。B.一个对象也可以调用析构方法释放对象自己。C.不能使用已被析构方法释放的对象,否则将产生运行错误。,3.2.5 析构方法,例如:d.finalize();/调用对象的析构方法,3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof 对象运算符3.2.3 访问控制3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,3.2.6 浅拷贝与深拷贝,浅拷贝一个类的拷贝构造方法,使用一个已知实例 对新创建实例的成员变量逐个赋值,这种方 法称为浅拷贝。,当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。,例如:MyDate d2=new MyDate(d1);,图3.4 浅拷贝,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);,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 当成员变量是引用类型时,深拷贝才能复制实例,3.2.6 浅拷贝与深拷贝,【例3.3】使用对象作为成员变量并实现深拷贝的 Person类。,深拷贝当一个类包含引用类型的成员变量时,该类的拷贝构造 方法,不仅要复制对象的所有非引用成员变量值,还要 为引用类型的成员变量创建新的实例,并初始化为形式 参数实例值,这种复制方法称为深拷贝。,由于String是常量字符串类型,当改变一个字符串对象时,自动创建一个新的字符串实例。,3.3 类的继承性,3.3.1 由继承派生类3.3.2 继承原则及作用3.3.3 子类的构造方法,继承(inheritance)是面向对象的重要概念之一,它提供在已有类的基础上创建新类的方式,是构造可复用软件的有效机制。,3.3.1 由继承派生类,1.继承的概念,继承(inherit):根据一个已知的类由继承方式创建一个类,使新 创建的类自动拥有被继承类的全部成员。父类/超类被继承类;子类/派生类通过继承产生的新类。,父类和子类的关系:,A.子类自动拥有父类的全部成员,包括成员变量和方法等,使父类成员得以传承和延续;B.子类可以更改从父类继承来的成员,使父类成员适应新的 需求;C.子类也可以增加自己的成员,使类的功能得以扩充。D.但是,子类不能删除父类的成员。,2.声明继承的类,修饰符 class 类 extends 父类 implements 接口列表,注意:Java的类是单继承的,一个类只能有一个父类,不能有 多个父类。,3.3.1 由继承派生类,【例3.4】Student类继承Person类。演示类的继承关系以及继承原则。,1.继承原则,3.3.2 继承原则及作用,(1)子类继承父类的成员变量 子类继承父类所有的成员变量,包括实例成员变量和静态成员变量。,(2)子类继承父类除构造方法以外的成员方法 子类继承父类除构造方法以外的成员方法,包括实例成员方法和静态成员方法。子类能够继承父类的析构方法。通过子类对象可以调用从父类继承来的成员方法。,1.继承原则,(3)子类不能继承父类的构造方法。子类没有继承父类的构造方法,因为父类的构造方法只能创建父类实例并初始化,无法创建子类实例。,3.3.2 继承原则及作用,(4)子类可以增加成员,可以重定义从父类继承来的成员,但 不能删除它们。,例如:父类声明构造方法Person(String,MyDate),当子类没有声明 Student(String,MyDate)构造方法时,下列语句错误:Student s1=new Student(“李小明”,new MyDate(1979,3,15);/语法错,构造方法参数不匹配,2.继承的作用,继承在父类与子类之间建立了联系:子类对象即是父类对象,子类自动拥有父类的全部成员,包括成员变量和成员方法等,使父类成员得以传承和延续;子类不能删除但可以更改从父类继承来的成员,使父类成员适应新的需求;子类也可以增加自己的成员,使类的功能得以扩充。,3.3.2 继承原则及作用,2.继承的作用,3.3.2 继承原则及作用,祖先类后代类:具有继承关系的、相距多个层次的类。父类直接祖先类,Java只允许类之间的单继承,单继承方式下:父类和子类是一对多的关系,由此形成具有树形结构的类的层次体系。Java约定该树的根是Object类。,3.3.2 继承原则及作用,2.继承的作用,继承是实现软件重用的重要措施,增强了软件的可扩充能力,提高了软件的可维护性。,祖先类中设计通用性的功能;后代类中设计特殊性的功能。,3.3.2 继承原则及作用,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/析构方法,4.子类对父类成员的访问权限,虽然子类继承了父类的所有成员,但并不是对所有成员都有访问权限。访问权限说明如下:,(1)子类不能访问父类的私有成员(private)。子类不能访问父类声明为私有的成员变量和成员方法。(2)子类能够访问父类的公有成员和保护成员。(3)子类对父类的缺省权限成员的访问控制,以包为界分两种 情况:可以访问当前包中父类的缺省权限成员,不能访问 其他包中父类的缺省权限成员。,3.3.2 继承原则及作用,4.子类对象对父类成员的访问权限,类中成员的访问控制权限体现封装的信息隐藏原则:如果仅限于本类使用,则声明成员为private;如果可被子类使用,则声明成员为protected;如果希望被所有类访问,则声明成员为public。,3.3.2 继承原则及作用,3.3.3 子类的构造方法,子类对象包含从其父类继承来的成员变量,以及子类声明的成员变量,子类构造方法必须对这些成员变量进行初始化。而父类构造方法已对父类声明的成员变量进行了初始化,因此,子类构造方法必须调用父类的某一个构造方法。,3.3.3 子类的构造方法,1.使用super()调用父类构造方法,super(参数列表),在子类的构造方法体中,可以使用“super引用”调用父类的构造方法。其语法格式如下:,public Student(String name,MyDate birthday,String spec)/构造方法 super(name,birthday);/super()调用必须是第一条语句,调用父类同参数的构造方法 this.speciality=spec;,2.默认执行super(),(1)当一个类没有声明构造方法时,Java为该类提供默认构造 方法,调用super()执行父类无参数的构造方法。,以下两种情况下,Java默认执行super(),调用父类的构造方法。,Public Student()/Java提供的默认构造方法 super();/调用父类构造方法Person()例如:Student s1=new Student();,3.3.3 子类的构造方法,2.默认执行super(),如果父类Person没有声明构造方法Person(),则上述语句产生编译错误。因此,每个类都要声明无参数的构造方法,即使自己不用,也要为子类准备着。,Public Person()/Java提供的默认构造方法 super();/调用父类构造方法Object(),3.3.3 子类的构造方法,2.默认执行super(),(2)如果子类的构造方法没有调用super()或this(),Java将默认执 行super()。,3.3.3 子类的构造方法,Public Student()super();/Java默认调用 speciality=“”;,3.4 类的多态性,3.4.1 子类重定义从父类继承来的成员3.4.2 类型的多态3.4.3 编译时多态和运行时多态3.4.4 多态的方法实现,提供类中方法设计的灵活性和执行的多样性,多态性指一个方法可以有多种实现版本,即“一种定义,多种实现”。,例如:+1/正,单目运算 1+2/加法运算,双目运算,操作数是数值“1”+“2”/字符串连接运算,双目运算,操作数是字符串,类的多态性表现为方法的多态和类型的多态。方法的多态:包括方法的重载和覆盖,为一种功能提供多种实现。类型的多态:子类是一种父类类型。,3.4 类的多态性,3.4.1 子类重定义从父类继承来的成员,当子类从父类继承来的成员不能满足子类需要时,子类不能删除它们,但可以重定义它们,扩充父类成员方法的功能,使父类成员能够适应子类新的需求。,子类重定义父类成员包括:重定义父类的成员变量,则隐藏父类的成员变量;重定义父类的成员方法,如果参数列表相同,则覆盖父类的 成员方法,否则重载。,子类重定义父类成员表现出多态性,父类对象引用父类成员,子类对象引用子类成员。重定义的同名成员之间不会产生冲突和混乱。,3.4.1 子类重定义从父类继承来的成员,super.成员变量/当子类隐藏父类成员变量时,引用父类同名成员变量super.成员方法(参数列表)/当子类覆盖父类成员方法时,调用父类同名成员方法,在子类的成员方法中,如果需要引用被子类隐藏或覆盖的父类同名成员,可使用super引用。格式如下:,3.4.1 子类重定义从父类继承来的成员,子类隐藏父类成员变量:count子类覆盖父类成员方法 howMany()、toString()、finalize()子类继承并重载父类成员方法:set(),【例3.5】Student类重定义从父类继承来的成员。声明Student类重定义从父类Person继承来的某些成员 变量和成员方法。,3.4.1 子类重定义从父类继承来的成员,子类隐藏父类成员变量:count子类覆盖父类成员方法 howMany()、toString()、finalize()子类继承并重载父类成员方法:set(),【例3.5】Student类重定义从父类继承来的成员。声明Student类重定义从父类Person继承来的某些成员 变量和成员方法。,3.4.2 类型的多态,子类通过继承方式扩充和发展了它的父类,继承约定了子类与父类之间存在的isA关系,子类是父类的一种特殊类型。例如:Student类Person类isA关系isA关系与hasA关系不同,hasA关系表示一个对象使用另一个对象来存储自身的状态。例如:Person类MyDate类hasA关系 一个Person对象中有一个MyDate对象表示生日属性,Person对象通过birthday成员变量引用一个MyDate对象。,3.4.2 类型的多态,1.子类对象即是父类对象,子类对象包含了父类的所有成员变量,isA关系表现为继承具有“即是”性质:子类对象即是父类对象。反之不然,父类对象不是它的子类对象。使用对象运算符instanceof可以判断一个对象是否属于指定类及其子类。,例如:new Person()instanceof Person/结果是truenew Student()instanceof Person/结果是true,子类对象即是父类对象new Person()instanceof Student/结果是false,父类对象不是子类对象,3.4.2 类型的多态,2.父类对象引用子类实例,子类对象即是父类对象,表现为父类与子类之间具有赋值相容性,即父类对象能够引用子类实例,反之不行。,例如:Person p=new Student();/赋值相容,子类对象即是父类对象 Student s=new Person();/语法错,赋值不相容,父类对象不是子类对象,再扩展到Object类,由于所有类都是Object的子类,所以,一个Object对象能够引用任何类的实例。,例如:Object obj=new Person();/赋值相容,子类对象即是父类对象,3.4.2 类型的多态,即是性质也表现在方法调用的参数传递过程中。,例如:public int olderThen(Person p)p1.olderThen(s1)/父类对象调用本类方法,参数为子类对象 s1.olderThen(p1)/子类对象调用父类方法,参数为父类对象 s2.olderThen(s1)/子类对象调用父类方法,参数为子类对象,3.4.3 编译时多态和运行时多态,1.编译时多态性,对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性。,方法的重载都是编译时多态性。,方法的覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态性;否则为运行时多态性。,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 编译时多态和运行时多态,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类没有声明该方法,3.4.3 编译时多态和运行时多态,程序运行时,Java从实例所属的类开始寻找匹配的方法执行,如果当前类中没有匹配方法,则沿着继承关系逐层向 上,依次在父类或各祖先类中寻找匹配方法,直到Object类。,图3.8 寻找p2.toString()匹配执行方法,3.4.4 多态的方法实现,从类的使用者角度看,方法的多态性使一个功能具有统一风格,不仅在一个类中,也在父类与多个子类之间具有相同的约定。从类的设计者角度看,类的继承性和多态性使类易于扩充功能,增强了软件的可维护性。,1.多态的toString()方法,public String toString()/返回由当前对象所属类名和十六进制的哈希码组成的描述对象信息的字符串 return getClass.getName()+“”+Integer.toHexString(hasCode();,3.4.4 多态的方法实现,2.多态的equals()方法,public boolean equals(Object obj)/比较两个对象是否相等,比较的是两个对象是否引用同一个实例。return this=obj;,3

    注意事项

    本文(Java初学简单课件第3章类的封装、继承和多态.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开