Java程序设计教程课件_第1页
Java程序设计教程课件_第2页
Java程序设计教程课件_第3页
Java程序设计教程课件_第4页
Java程序设计教程课件_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人民邮电出版社6继承与多态Java程序设计第章C目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.1.1子类定义子类定义实际上就是定义类的过程,只不过是在父类的基础上定义。子类定义形式:Java语言只支持单重继承。除了Object类之外每个类都有一个父类,它是所有类的直接父类或间接父类。如果在定义一个类时没有说明该继承自哪一个类,则该类的父类是Object。class子类名extends父类名{//子类类体//……}01OPTION02OPTION03OPTION04OPTION6.1.2子类的可访问性父类的私有成员可以被子类继承,但只能通过继承自父类的并且子类可以访问的方法间接访问。父类与子类不在同一个包中,则父类中的保护成员可以被子类中的方法直接访问,但在子类类体外不可以通过子类对象访问。类中的公有成员可以被子类中的方法直接访问,在子类类体外可以通过子类对象访问。父类与子类在同一个包中,则父类中的保护成员可以被子类中的方法直接访问,在子类类体外可以通过子类对象访问。01OPTION02OPTION6.1.2子类的可访问性父类与子类在同一个包中,则父类中的友好成员可以被子类中的方法直接访问,在子类类体外可以通过子类对象访问。

父类与子类不在同一个包中,则父类中的友好成员不可以被子类中的方法直接访问,在子类类体外不可以通过子类对象访问,只能通过继承自父类的并且子类可以访问的方法间接访问。【例6.1】设计一个圆类,该类能够表示圆的位置和大小,能够计算圆的面积和周长,能够对圆进行平移。定义圆类的对象并进行相应的操作,输出操作后的结果。Example6_01.java6.1.3instanceof运算符

instanceof运算符用于判断一个对象是否是某一个类的实例对象,或者是否是某一个类的子类的实例对象。instanceof的方法形式:对象名instanceof类名【例6.2】instanceof的用法。Example6_02.javaC目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.2.1域的隐藏子类根据需要可以将继承自父类的域进行隐藏。【例6.3】域隐藏举例。Example6_03.java子类中定义的域的名字与继承自父类的域的名字相同,则在子类中隐藏了继承自父类的域,子类中的方法不能访问父类中的被隐藏的域。6.2.2方法的重写当子类继承父类的方法后,子类根据自身的需要可以对继承的方法重新定义,以便使子类对象表现出与父类不同的行为。这种重新定义的过程称方法的重写(Override)。【例6.4】某公司给雇员发工资。雇员中有经理、技术人员和一般雇员,该公司给雇员定的工资标准是:一般雇员工资领固定工资,经理工资在一般雇员工资基础上加本月津贴,技术人员的工资在一般雇员工资基础上加技术津贴,技术津贴为工作小时数×单位津贴/小时。Example6_04.java6.2.3super关键字super表示当前类的直接父类。在有些情况下,还想访问被子类隐藏的域或被重写的方法,这种情况下则可以通过关键字super实现相应的访问。如果想明确地访问继承自父类中的域,可以通过下面形式访问:super.域名表示访问当前类直接父类中的域。如果想明确地调用继承自父类中的方法,可以通过下面形式访问:super.方法名([实际参数])super还可以用于调用直接父类的构造方法:super([实际参数]);6.2.3super关键字调用父类的构造方法有如下的规则:在构造子类对象时,父类的构造方法一定会被调用;如果子类的构造方法使用了super调用父类的构造方法,则按给定的参数调用父类中相应的构造方法;如果在子类的构造方法中没有使用super调用父类的构造方法,则父类中的没有参数的构造方法会被自动调用。如果子类没有使用super调用父类构造方法并且父类中也没有定义没有参数的构造方法,则编译不能通过。6.2.3super关键字【例6.5】平面上有若干条线段,已知每条线段两个端点的坐标。设计线段类并创建线段类的对象表示线段。要求用继承的方法实现。Example6_05.java如果父类和子类中都定义了实例初始化器,则构造子类对象时,调用顺序为“父类的实例初始化器→父类的构造方法→子类的实例初始化器→子类的构造方法”。C目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.3

对象的赋值兼容规则在有继承关系的类中,可以用父类对象表示子类的对象,称为赋值兼容规则。例如,类B是类A的子类,则下面的赋值是正确的:Aa=newB();当用父类对象表示子类对象时,父类对象称为子类对象的上转型对象。当一个父类对象表示的是子类对象时,还可以将该父类对象强制转换成子类对象。如:Bb=(B)a;将上转型对象转换为子类对象称为下转型对象。6.3

对象的赋值兼容规则当用一个父类对象表示子类对象后,父类对象:可以访问子类继承自父类的域或被子类隐藏的域;可以调用子类继承自父类的方法或被子类重写的方法;不能访问子类相对于父类新增加的域或方法。所以,通过父类访问的域或方法一定是继承自父类的域或方法、或者是隐藏继承自父类的域、或者是重写继承自父类的方法。使用赋值兼容规则主要是为了实现多态性。C目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.4.1final修饰类关键字final可以修饰类,可以修饰方法,还可以修饰域。finalclass类名{//……}final修饰的类称为最终类。修饰的形式:最终类不能派生子类。定义最终类的目的是不希望父类中的域被子类隐藏、方法被子类重写,可以对类起到保护作用。典型的最终类就是String类。6.4.2final修饰方法[访问限定词][static]final方法类型方法名([参数]){//……}final修饰的方法称为最终方法。修饰的形式:最终方法可以被子类继承,但不能被子类重写,从而对父类的方法起到保护作用。6.4.3常量final修饰的域称为最终域,又称为常量。修饰的形式:[访问限定词][static]final数据类型域名=初值;C目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.5.1多态概念同一类对象表现出的不同行为称为多态。多态的实现一定得在有继承关系的对象中。每一个子类的对象的行为都与其它子类对象或父类对象的行为不同,这种行为上的不同称为多态性。程序设计语言本身必须支持多态性,编程时才能够实现多态性。6.5.2多态的实现经过下面几步可以实现多态性:通过父类对象名调用被子类重写的方法。【例6.6】有多种交通工具,利用多态性表现出每种交通工具的正确运行状态。

Example6_06.java定义一个基类,在此基类基础上再派生出若干个子类;01OPTION02OPTION03OPTION04OPTION子类要重写父类中的方法,使子类对象能够表现出子类的行为;用父类对象名表示子类对象(赋值兼容规则);C目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.6.1abstract修饰类关键字abstract修饰的类称为抽象类。抽象类定义的形式:关键字abstract可以修饰类,也可以修饰类中的方法。abstractclass类名{//……}抽象类不能生成对象实例。6.6.2abstract修饰方法关键字abstract修饰的方法称为抽象方法。抽象方法定义的形式:[访问限定词]abstract数据类型方法名([参数表列]);抽象方法只有方法的头部,没有方法体。抽象方法一定不能用关键字final修饰。抽象类中可以有非抽象(实例)方法,也可以有抽象方法。如果一个类中有抽象方法,该类必须定义成抽象类。【例6.7】有若干个圆和矩形,已知每个圆的半径和矩形的长、宽,计算这些圆和矩形的面积和周长。Example6_07.javaC目录ONTENTS6.2域的隐藏和方法的重写6.3对象的赋值兼容规则6.7泛型6.1子类及其对象6.4final关键字6.5多态6.6abstract关键字6.8小结6.7.1泛型的概念

比类更高一层的抽象表示。泛型类,就是可以将封装方式相同但属性类型不同的多个类用一个泛型类表示,减少程序的开发工作量,提高软件的开发效率。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。6.7.2声明泛型类泛型类是带有类型参数的类,类中有域和行为。域的数据类型可以是已有类型,也可以是“类型参数”的类型。泛型类方法的类型、参数和方法中的局部变量可以是已有类型,也可以是“类型参数”的类型。泛型类的定义形式是:class泛型类名<类型参数表列>{ //类体}在“泛型类名”后的“<>”指明类型参数的名字,如果多个用英文逗号分隔。类型参数的名字就是在类体中要用到的表示数据类型的符号,一般是合法的标识符就行,但通常用T、E、K、V等表示。约定:T(type)表示具体的一个java类型,K、V分别代表java键值对中的Key和Value,E代表Element。6.7.2声明泛型类泛型类的对象的定义:泛型类名[<实际类型表列>]对象名=new泛型类名[<实际类型表列>]([形参表]);或泛型类名[<实际类型表列>]对象名=new泛型类名[<>]([形参表]);【例6.8】设计一个数组类,该类的对象能表示任何类型的对象数组(以非泛型方式实现)。Example6_08.java实际类型不能是基本数据类型,必须是类或接口类型。<实际类型参数表列>也可以不写,如果不写,则泛型类中的所有对象都看作是Object类的对象。也可以用“?”代替“实际参数表列”,“?”表示可以是任何一个类,叫通配符。【例6.9】以泛型方式实现例6.8的功能。Example6_09.java6.7.3声明泛型接口除了可以定义泛型类外,还可以定义泛型接口。泛型接口定义形式:interface接口名<类型参数表列>{//……}6.7.3声明泛型接口在实现接口时,也应该声明与接口相同的类型参数。实现形式如下:class类名<类型参数表列>implements接口名<类型参数表列>{//…}【例6.10】定义泛型接口并实现泛型接口。Example6_10.java6.7.4声明泛型方法[访问限定词][static]<类型参数表列>方法类型方法名([参数表列]){//…}方法也可以是泛型方法,泛型方法可以定义在泛型类中,也可以定义在非泛型类中。泛型方法定义形式:【例6.11】泛型方法的定义与使用。Example6_11.java6.7.5泛型参数的限定有时候只想接收指定范围内的类类型,过多的类型就可能会产生错误,这时可以对泛型的参数时进行限定。参数限定的语法形式:类型形式参数extends父类“类型形式参数”是指声明泛型类时所声明的类型,“父类”表示只有这个类下面的子类才可以做实际类型。【例6.12】定义一个泛型类,能够找出多个数据中的最大数和最小数。Example6_12.java6.7.6泛型的使用及通配符上界通配符的定义形式:

C<?extendsT>C表示泛型类,T表示类型或者接口,此处只能一个,?代表泛型里的元素类型,“?extendsT”表示它必须是T的子类(也包括自身)或实现了T接口的类。下界通配符的定义形式:C<?superT>这里的T同样只能是一个类或接口,也不能多个。?代表泛型里的元素类型,“?superT”表示它必须是T的超类(包括自身)。【例6.13】泛型及泛型通配符的简单使用。Example6_13.java6.7.6泛型的使用及通配符上界<?extendsT>不能往里存,只能往外取:<?extendsT>会使往盘子里放东西的set()方法失效,但取东西get()方法还有效,取出来的东西只能存放在T或它的基类里面,向上转型。下界<?superT>不影响往里存,但往外取只能放在Object对象里:使用下界<?superT>会使从盘子里取东西的get()方法部分失效,只能存放到Object对象里。因为规定的下界,对于上界并不清楚,所以只能放到最根本的基类Object中;set()方法正常。6.7.6泛型的使用及通配符使用上界通配符,下界通配符遵循原则:PECS原则。PECS(ProducerExtendsConsumerSuper)原则中,ProducerExtends生产者使用Extends来确定上界,往里面放东西表示生产。ConsumerSuper消费者使用Super来确定下界,往外取东西表示消费。频繁往外读取内容的,适合用上界exte

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论