




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四篇子类与继承 主要内容 子类与父类 子类的继承性 子类对象的特点 成员变量的隐藏和方法重写 super关键字 final关键字 对象的上转型对象 继承与多态 abstract类与abstract方法 面向抽象编程 开 闭原则难点 成员变量的隐藏和方法重写 开 闭原则 1 子类与父类 当我们准备编写一个类的时候 发现某个类已经有了我们所需要的成员变量和方法 假如我们想复用这个类中的成员变量和方法 即在所编写的类中不用声明成员变量就相当于有了这个成员变量 不用定义方法就相当于有了这个方法 那么我们可以将编写的类声明为这个类的子类 在类的声明中 通过使用关键字extends来声明一个类的子类 格式如下 class子类名extends父类名 例如 classStudentextendsPeople 1 子类与父类 所谓子类继承父类的成员变量作为自己的一个成员变量 就好像它们是在子类中直接声明一样 可以被子类中自己定义的任何实例方法操作所谓子类继承父类的方法作为子类中的一个方法 就像它们是在子类中直接定义了一样 可以被子类中自己定义的任何实例方法调用 如果子类中定义的实例方法不能操作父类的某个成员变量或方法 那么该成员变量或方法就没有被子类继承 子类不仅可以从父类继承成员变量和方法 而且根据需要还可以声明它自己的新成员变量 定义新的方法 2 子类的继承性 访问限制修饰符不仅限制了对象对自己成员变量的操作和方法的调用 也限制了继承性 当子类和父类在同一个包中时 子类继承父类中的除private访问权限以外的其他成员变量作为子类的成员变量 子类继承父类中的除private访问权限以外的其他方法作为子类的方法 2 1同一包的继承性 People javapublicclassPeople doubleheight 170 weight 67 9 protectedvoidtellHeightAndWeight System out printf 我的体重和身高 2 2fkg 2 2fcm n weight height Student javapublicclassStudentextendsPeople intnumber voidtellNumber System out println 我的学号是 number intadd intx inty returnx y intsub intx inty returnx y UniverStudent javapublicclassUniverStudentextendsStudent intmulti intx inty returnx y doublediv doublex doubley returnx y Example5 1 javapublicclassExample5 1 publicstaticvoidmain Stringargs intx 12 y 18 Studentzhang newStudent zhang weight 73 8 zhang height 177 zhang number 100101 zhang tellHeightAndWeight zhang tellNumber System out print zhang会做加减 intresult zhang add x y System out printf d d d t x y result result zhang sub x y System out printf d d d n x y result UniverStudentgeng newUniverStudent geng number 6609 geng tellHeightAndWeight geng tellNumber System out print geng会做加减乘除 result geng add x y System out printf d d d t x y result result geng sub x y System out printf d d d t x y result result geng multi x y System out printf d d d t x y result doublere geng div x y System out printf d d f n x y re 当子类和父类不在同一个包中时 private和友好访问权限的成员变量不会被继承 子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量 子类只继承父类中的protected和public访问权限的方法作为子类的方法 2 2不同包的继承性 一个类A中的protected成员变量和方法可以被它的直接子类和间接子类继承 如B是A的子类 C是B的子类 D又是C的子类 那么B C和D类都继承了A类的protected成员变量和方法 如果用D类在D中创建了一个对象 那么该对象总是可以通过 运算符访问继承的或自己定义的protected变量和protected方法的但是 如果在另外一个类中 如在Other类中用D类创建了一个对象object 该对象通过 运算符访问protected变量和protected方法的权限如下列 1 2 所述 2 3protected的说明 1 对于子类D中声明的protected成员变量和方法 如果object要访问这些protected成员变量和方法 只要Other类和D类在同一个包中就可以了 2 如果子类D的对象的protected成员变量或protected方法是从父类继承的 那么就要一直追溯到该protected成员变量或方法的 祖先 类 即A类 如果Other类和A类在同一个包中 那么object对象能访问继承的protected变量和protected方法 如果一个类是另一个类的子类 那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系 Generalization 实线的起始端是子类的UML图 终点端是父类的UML图 但终点端使用一个空心的三角形表示实线的结束 2 4继承关系的UML图 instanceof是双目运算符 其左面的操作元是对象 右面的操作元是类 当左面的操作元是右面的类或子类所创建的对象时 instanceof运算的结果是true 否则是false 例 zhaoqianginstanceofPeople是truezhanginstanceofUniverStudent是false 2 5关于instanceof运算符 当用子类的构造方法创建一个子类的对象时 不仅子类中声明的成员变量被分配了内存 而且父类的成员变量也都分配了内存空间 但只将其中一部分 子类继承的那部分 作为分配给子类对象的变量 父类中的private成员变量尽管分配了内存空间 也不作为子类对象的变量 如果子类和父类不在同一包中 尽管父类的友好成员变量分配了内存空间 但也不作为子类的成员变量 子类中还有一部分方法是从父类继承的 这部分方法却可以操作这部分未继承的变量 3子类对象的特点 A javapublicclassA privateintx publicvoidsetX intx this x x publicintgetX returnx B javapublicclassBextendsA doubley 12 publicvoidsetY inty this y y x 非法 子类没有继承x publicdoublegetY returny Example5 2 javapublicclassExample5 2 publicstaticvoidmain Stringargs Bb newB b setX 888 System out println 子类对象未继承的x的值是 b getX b y 12 678 System out println 子类对象的实例变量y的值是 b getY 4成员变量的隐藏和方法重写 在编写子类时 如果所声明的成员变量的名字和从父类继承来的成员变量的名字相同 声明的类型可以不同 在这种情况下 子类就会隐藏掉所继承的成员变量 即子类对象以及子类自己声明定义的方法操作与父类同名的成员变量是指子类重新声明定义的这个成员变量 需要注意的是 子类对象仍然可以调用从父类继承的方法操作隐藏的成员变量 4 1成员变量的隐藏 Goods javapublicclassGoods publicdoubleweight publicvoidoldSetWeight doublew weight w System out println double型的weight weight publicdoubleoldGetPrice doubleprice weight 10 returnprice CheapGoods javapublicclassCheapGoodsextendsGoods publicintweight publicvoidnewSetWeight intw weight w System out println int型的weight weight publicdoublenewGetPrice doubleprice weight 10 returnprice Example5 3 javapublicclassExample5 3 publicstaticvoidmain Stringargs CheapGoodscheapGoods newCheapGoods cheapGoods weight 198 98 是非法的 因为子类对象的weight已经不是double型cheapGoods newSetWeight 198 System out println 对象cheapGoods的weight的值是 cheapGoods weight System out println cheapGoods用子类新增的优惠方法计算价格 cheapGoods newGetPrice cheapGoods oldSetWeight 198 987 子类对象调用继承的方法操作隐藏的double型变量weightSystem out println cheapGoods使用继承的方法 无优惠 计算价格 cheapGoods oldGetPrice 重写的语法规则如果子类可以继承父类的某个实例方法 那么子类就有权利重写这个方法 方法重写是指 子类中定义一个方法 这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型 所谓子类型是指 如果父类的方法的类型是 类 那么允许子类的重写方法的类型是 子类 并且这个方法的名字 参数个数 参数的类型和父类的方法完全相同 子类如此定义的方法称作子类重写的方法 不属于新增的方法 4 2方法重写 Override 2 重写的目的子类通过方法的重写可以隐藏继承的方法 子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为 如果父类的方法f可以被子类继承 子类就有权利重写f 一旦子类重写了父类的方法f 就隐藏了继承的方法f 那么子类对象调用方法f调用的一定是重写方法f 重写方法既可以操作继承的成员变量 继承的方法 也可以操作子类新声明的成员变量 新定义的其他方法 但无法操作被子类隐藏的成员变量和方法 如果子类想使用被隐藏的方法或成员变量 必须使用关键字super Example5 5 javaclassA floatcomputer floatx floaty returnx y publicintg intx inty returnx y classBextendsA floatcomputer floatx floaty returnx y publicclassExample5 5 publicstaticvoidmain Stringargs Bb newB doubleresult puter 8 9 b调用重写的方法System out println 调用重写方法得到的结果 result intm b g 12 8 b调用继承的方法System out println 调用继承方法得到的结果 m 3 JDK1 5对重写的改进在JDK1 5版本之后 允许重写方法的类型可以是父类方法的类型的子类型 即不必完全一致 JDK1 5版本之前要求必须一致 4 重写的注意事项重写父类的方法时 不可以降低方法的访问权限 5super关键字 子类一旦隐藏了继承的成员变量 那么子类创建的对象就不再拥有该变量 该变量将归关键字super所有同样子类一旦隐藏了继承的方法 那么子类创建的对象就不能调用被隐藏的方法 该方法的调用由关键字super负责 因此 如果在子类中想使用被子类隐藏的成员变量或方法就需要使用关键字super 5 1用super操作被隐藏的成员变量和方法 Bank javapublicclassBank intsavedMoney intyear doubleinterest publicdoublecomputerInterest interest year 0 035 savedMoney System out printf d元存在银行 d年的利息 f元 n savedMoney year interest returninterest ConstructionBank javapublicclassConstructionBankextendsBank doubleyear publicdoublecomputerInterest super year int year doubleremainNumber year int year intday int remainNumber 1000 interest puterInterest day 0 0001 savedMoney System out printf d元存在建设银行 d年零 d天的利息 f元 n savedMoney super year day interest returninterest BankOfDalian javapublicclassBankOfDalianextendsBank doubleyear publicdoublecomputerInterest super year int year doubleremainNumber year int year intday int remainNumber 1000 interest puterInterest day 0 00012 savedMoney System out printf d元存在大连银行 d年零 d天的利息 f元 n savedMoney super year day interest returninterest Example5 7 javapublicclassExample5 7 publicstaticvoidmain Stringargs intamount 5000 ConstructionBankbank1 newConstructionBank bank1 savedMoney amount bank1 year 5 216 doubleinterest1 puterInterest BankOfDalianbank2 newBankOfDalian bank2 savedMoney amount bank2 year 5 216 doubleinterest2 puterInterest System out printf 两个银行利息相差 f元 n interest2 interest1 如果子类的构造方法没有明显地指明使用父类的哪个构造方法 子类就调用父类的不带参数的构造方法 即如果在子类的构造方法中 没有明显地写出super关键字来调用父类的某个构造方法 那么默认地有 super 子类不继承父类的构造方法 因此 子类在其构造方法中需使用super来调用父类的构造方法 而且super必须是子类构造方法中的头一条语句 5 2用super调用父类的构造方法 Card javapublicclassCard Stringtitle Card title 新年快乐 Card Stringtitle this title title publicStringgetTitle returntitle ChristmasCard javapublicclassChristmasCardextendsCard Stringcontent 子类新增的contentChristmasCard Stringtitle Stringcontent super title 调用父类的构造方法 即执行Card title this content content publicvoidshowCard System out println getTitle System out printf s content Example5 8 javapublicclassExample5 8 publicstaticvoidmain Stringargs Stringtitle HappyNewYearToYou Stringcontent t牛年耕耘 n t谷穗满仓 n t出生牛犊 n t喜迎虎年 n ChristmasCardcard newChristmasCard title content card showCard final关键字可以修饰类 成员变量和方法中的局部变量 6final关键字 可以使用final将类声明为final类 final类不能被继承 即不能有子类 如 finalclassA A就是一个final类 将不允许任何类声明成A的子类 有时候是出于安全性的考虑 将一些类修饰为final类 例如 Java提供的String类 它对于编译器和解释器的正常运行有很重要的作用 对它不能轻易改变 它被修饰为final类 6 1final类 如果用final修饰父类中的一个方法 那么这个方法不允许子类重写 也就是说 不允许子类隐藏可以继承的final方法 老老实实继承 不许做任何篡改 6 2final方法 如果成员变量或局部变量被修饰为final 那么它就是常量 常量在声明时没有默认值 所以在声明常量时必须指定该常量的值 而且不能再发生变化 6 3常量 假设 A类是B类的父类 当用子类创建一个对象 并把这个对象的引用放到父类的对象中时 如 Aa a newB 或Aa Bb newB a b 这时 称对象a是对象b的上转型对象 就像说 美国人是人 对象的上转型对象的实体是子类负责创建的 但上转型对象会失去原对象的一些属性和功能 上转型对象相当于子类对象的一个 简化 对象 7对象的上转型对象 上转型对象具有如下特点 1 上转型对象不能操作子类新增的成员变量 失掉了这部分属性 2 不能调用子类新增的方法 失掉了一些功能 3 上转型对象可以访问子类继承或隐藏的成员变量 也可以调用子类继承的方法或子类重写的实例方法 上转型对象操作子类继承的方法或子类重写的实例方法 其作用等价于子类对象去调用这些方法 因此 如果子类重写了父类的某个实例方法后 当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法 People javapublicclassPeople intheight doubleweight voidshowBodyMess System out printf n voidmustDoingThing System out println 吃饭 睡觉 饮水 American javapublicclassAmericanextendsPeople voidshowBodyMess System out println bodyHeight height cm bodyWeight weight kg voidspeakEnglish System out println IamAmerian Chinese javapublicclassChineseextendsPeople voidshowBodyMess System out printf 身高 5dcm t体重 3 2fkg n height weight voidspeakChinese System out println 我是中国人 Example5 10 javapublicclassExample5 10 publicstaticvoidmain Stringargs Peoplepeople null AmericanJohnson newAmerican people Johnson people是Johnson对象的上转型对象 people height 187 同于Johnson height 187people weight 78 67 people showBodyMess 等同于Johnson调用重写的showBodyMess 方法 people speakEnglish 非法 因为speakEnglish 是子类新增的方法people mustDoingThing Chinesezhang newChinese people zhang people是zhang对象的上转型对象 people height 177 同于zhang height 187people weight 68 59 people showBodyMess 等同于Johnson调用重写的showBodyMess 方法 people speakChinese 非法 因为speakChinese 是子类新增的方法people mustDoingThing zhang Chinese people zhang speakChinese 多态性就是指父类的某个实例方法被其子类重写时 可以各自产生自己的功能行为 8继承与多态 classEspecialCar voidcautionSound classPoliceCarextendsEspecialCar voidcautionSound System out println zhua zhua zhua classAmbulanceCarextendsEspecialCar voidcautionSound System out println jiu jiu jiu classFireCarextendsEspecialCar voidcautionSound System out println huo huo huo publicclassExample5 11 publicstaticvoidmain Stringargs EspecialCarcar newPoliceCar car是警车的上转型对象car cautionSound car newAmbulanceCar car是救护车的上转型对象car cautionSound car newFireCar car是消防车的上转型对象car cautionSound 用关键字abstract修饰的类称为abstract类 抽象类 如 abstractclassA 用关键字abstract修饰的方法称为abstract方法 抽象方法 对于abstract方法 只允许声明 不允许实现 而且
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新解读《GB-T 31155-2014太阳能资源等级 总辐射》
- 食堂厨师服务合同范本
- 租赁私人车辆合同范本
- 土方挖运输合同范本
- 房屋购销合同范本
- 租房合同范本怎么制作
- 工地包工合同范本
- 帐篷营地营运合同范本
- 喷粉合同范本
- 店铺共享出租合同范本
- 2024年交管12123学法减分试题题库附答案
- 2024年湖南省长沙住房公积金管理中心招聘历年高频难、易点(公共基础测验共200题含答案解析)模拟试卷
- 《我与地坛》教学设计 统编版高中语文必修上册
- 工业固废运输处置投标方案(技术标)
- 上海市语文新初一均衡分班试卷
- KA-T 20.1-2024 非煤矿山建设项目安全设施设计编写提纲 第1部分:金属非金属地下矿山建设项目安全设施设计编写提纲
- 微积分(第三版)课件:常微分方程
- (高清版)DZT 0079-2015 固体矿产勘查地质资料综合整理综合研究技术要求
- 钝感力读后感课件
- (完整word版)软件投标书模板
- 甲醇制氢生产装置设计
评论
0/150
提交评论