《类的继承性》PPT课件.ppt_第1页
《类的继承性》PPT课件.ppt_第2页
《类的继承性》PPT课件.ppt_第3页
《类的继承性》PPT课件.ppt_第4页
《类的继承性》PPT课件.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

访问控制权限了解 第3讲面向对象编程 高级篇 面向对象编程 基础篇 知识回顾 主要内容 3 1继承性3 2多态性3 3抽象类3 4接口3 5内部类和匿名类 3 1继承的作用3 2子类对象的创建3 3在子类中访问父类的成员3 4覆盖父类的方法 3 1 1继承 为什么引入继承的特性 模仿人类的思维方式 人类的继承性 Person类classPerson privateStringname privateintage publicStringgetName returnname publicvoidsetName Stringn name n publicintgetAge returnage publicvoidsetAge inta age a Student类classStudent privateStringname privateintage privateStringschool publicStringgetName returnname publicvoidsetName Stringn name n publicintgetAge returnage publicvoidsetAge inta age a publicStringgetSchool returnschool publicvoidsetSchool Strings school s 3 1 1继承 为什么引入继承的特性 模仿人类的思维方式 人类的继承性 2 程序的代码重用性 少写代码 继承关系格式 class父类 class子类extends父类 试验 eXTdEMO1 JAVAeXTdEMO2 JAVA QQ牧场的设计 目的 了解在真实系统中进行设计时如何进行继承层次的设计 找出对象的共同属性和行为 这个程序必须能够在任何时候加入新类型的动物 首先要辨别出所有动物都有的 抽象的共同特征 然后以这些共同特征设计出能够让所有动物加以扩充的类 考虑 这6种动物有什么共同特点 这些类型有什么相关性 找出对象的共同属性和行为 5个实例变量 picture 动物JPEG图像的名称food 此动物所吃的食物 meat grass hunger 代表饥饿程度的int值 会根据动物吃了多少食物而改变 boundaries 代表动物活动范围区域的长宽 location 动物在活动区域中的位置 4个实例方法 makeNoise 动物发出声音的行为和程序 eat 动物遇到食物时的行为程序 sleep 睡眠的行为程序 roam 不在进食或睡眠时的行为程序 设计代表共同状态与行为的类 决定子类是否需要让某项行为有特定的不同的运行方式 决定子类是否需要让某项行为有特定的不同的运行方式 寻找更多抽象化的机会 完成类的继承层次 完成类的继承层次 寻找更多抽象化的机会 决定子类是否需要让某项行为有特定的不同的运行方式 设计代表共同状态与行为的类 如何进行继承层次的设计 自下而上的设计 找出对象的共同属性和行为 子类对象调用成员的原则 最低阶原则 添加子类的新成员 改造父类的成员 继承父类的成员 已知父类如何进行子类设计 自上而下的设计 访问控制权限了解 添加子类的新成员 改造父类的成员 继承父类的成员 已知父类如何进行子类设计 自上而下的设计 3 1 2子类对象的创建 一 子类对象的实例化过程二 super的作用 3 1 2子类的创建 一 子类对象的实例化过程classPerson publicPerson System out println 父类构造 classStudent publicStudent System out println 子类构造 3 1 2子类对象的创建 一 子类对象的实例化过程publicclassTestDemo11 publicstaticvoidmain Stringargs Studentstu newStudent 运行结果 3 1 2子类对象的创建 一 子类对象的实例化过程1 先自动调用父类构造函数 父类中的无参构造函数 2 然后调用子类构造函数注意 如果父类中有多个构造方法时 如何才能调用父类中某个特定的构造方法呢 其做法是在子类的构造方法中通过super 来调用父类特定的构造方法 3 1 2创建子类 二 super super classPerson privateStringname privateintage publicPerson System out println 调用Person类的无参构造方法 publicPeron Stringname intage System out println 调用了Person类的有参构造方法 this name name this age age publicvoidshow System out println 姓名 name 年龄 age 3 1 2子类对象的创建 classStudentextendsPerson privateStringdepartment publicStudent System out println Student无参构造 publicStudent Stringname intage Stringdep super name age department dep System out println 我是 department 的学生 System out println Student有参构造 3 1 2子类对象的创建 publicclassTestDemo1 publicstaticvoidmain Stringargs Studentstu1 newStudent Studentstu2 newStudent 李四 23 计算机系 stu1 show stu2 show 3 1 2子类对象的创建 省略红色字体super name age 父类中的构造方法哪个会被调用 子类构造方法中调用父类构造方法的super语句位置有没有限制 如果父类中只定义了有参的构造方法 而子类的构造方法中并没有显式的用super 来调用父类中特定的构造方法 程序此时会有问题吗 找出this和super的相同点和不同点 思考 找出继承中构造方法的调用规则 3 1 3成员变量的隐藏和方法的覆写 1 当在子类中定义的成员变量和父类中的成员变量同名时 此时称子类的成员变量隐藏了父类的成员变量 改造父类的成员 2 当子类中定义了一个方法 并且这个方法的名字 返回类型 参数个数以及类型和父类的某个方法完全相同时 父类的这个方法将被隐藏 这时我们说重写了父类的方法 子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为 3 1 3成员变量的隐藏和方法的覆写 例如下面的这段程序就是这样的情况 classSuperClass 父类inty voidsetY y 0 classSubClassextendsSuperClass inty 父类变量y被隐藏voidsetY 重写父类的方法setY y 1 publicTestDemo3 publicstaticvoidmain Stringargs SubClassss newSubClass ss setY 子类在隐藏了父类的成员变量或重写了父类的方法后 常常还要用到父类的成员变量 或在重写的方法中使用父类中被重写的方法以简化代码的编写 这时就要访问父类的成员变量或调用父类的方法 Java中通过super来实现对父类成员的访问 this用来引用当前对象 与this类似 super用来引用当前对象的父类 super的使用可以分为下面三种情况 1 用来访问父类被隐藏的成员变量 如 super y2 用来调用父类中被重写的方法 如 super setY 3 用来调用父类的构造方法 如 super paramlist 3 1 3成员变量的隐藏和方法的覆写 思考 方法的重载与覆写非常类似 找出它们的区别 课后讨论 讨论二类的继承性与多态性 1 主题一 方案设计分析主题三 知识原理掌握 构造方法的重载思考 1 找出父类向子类派生时 构造方法的调用规律 2 找出方法的重载与重写的区别 主题一 方案设计分析 写出你所能想到的所有二维 三维形状 并用它们组成一个形状层次结构 层次结构把Shape当作超类 并从中派生出TwoDimensionalShape类和ThreeDimensionalShape类 设计这个层次结构 并定义它的所有类 画出相应的类层次结构图 接下来考虑如果将Shape类变成abstract超类 TwoDimensionalShape类和hreeDimensionalShape类也是abstract类 进行相应的派生后 要求在第三层的类中计算出每个类对应对象的面积和体积 主题三 知识原理掌握 构造方法的重载 建立一个人类 Person 和学生类 Student 功能要求如下 1 Person中包含4个保护型的数据成员name addr sex age 表示姓名 地址 性别和年龄 用一个4参构造方法 一个两参构造方法 一个无参构造方法来实例化对象 用一个输出方法显示4种属性 2 Student类继承Person类 并增加输出成员math english存放数学 英语成绩 用一个6参构造方法 一个两参构造方法 一个无参构造方法来实例化对象 另外重写输出方法用于显示6种属性 第3章面向对象高级程序设计 3 1继承3 2多态性3 3抽象类和抽象方法3 4接口3 5内部类和匿名类 3 2多态性 多态 Polymorphism 的意思就是用相同的名字来定义不同的方法 在Java中 普通类型的多态为重载 这就意味着可以使几个不同的方法使用相同的名字 这些方法以参数的个数不同 参数的类型不同等方面来进行区分 以使得编译器能够进行识别 也可以这样讲 重载是同一个方法具有不同的版本 每个版本之间在参数特征方面有差异 重载是Java实现多态性的方式之一 例如 family 方法可以有三个版本 如下 family family Stringch address ch family Stringch floatn address ch pay n 这些方法并存于程序中 编译时 编译器根据实参的类型和个数来区分从而调用那个方法 如果这些方法作为函数或过程同时出现在其它语言的程序中 如C 那将导致灾难性的错误 3 2多态性 例3 6 构造方法重载的例子classperson Stringname Johnson 姓名intage 45 年龄person person Stringa name a person Stringa intb name a age b publicvoiddisplay System out println Name name Age age publicclassPoly publicstaticvoidmain String args personko1 newperson personko2 newperson Mike personko3 newperson Willian 50 ko1 display ko2 display ko3 display 3 2多态性 在Java语言中 多态性主要体现在两个方面 由方法重载实现的静态多态性 编译时多态 和方法重写实现的动态多态性 运行时多态 如下 1 编译时多态在编译阶段 具体调用哪个被重载的方法 编译器会根据参数的不同来静态确定调用相应的方法 2 运行时多态由于子类继承了父类所有的属性 私有的除外 所以子类对象可以作为父类对象使用 程序中凡是使用父类对象的地方 都可以用子类对象来代替 一个对象可以通过引用子类的实例来调用子类的方法 如果子类重写了父类的方法 那么重写方法的调用原则如下 Java运行时系统根据调用该方法的实例 来决定调用哪个方法 对子类的一个实例 如果子类重写了父类的方法 则运行时系统调用子类的方法 如果子类继承了父类的方法 未重写 则运行时系统调用父类的方法 另外 方法重写时应遵循的原则如下 改写后的方法不能比被重写的方法有更严格的访问权限 改写后的方法不能比被重写的方法产生更多的异常 进行方法重写时必须遵从这两个原则 否则编译器会指出程序出错 3 2多态性 例3 7 方法重写的例子classParent publicvoidfunction System out println IaminParent classChildextendsParent privatevoidfunction System out println IaminChild publicclassRTpolyTest publicstaticvoidmain Stringargs Parentpl newParent Parentp2 newChild p1 function p2 function 3 2多态性 编译过程如下 D user chap05 JavacRTpolyTest javaRTpolyTest java 8 function inChildcannotoverridefunction inParent attemptingtoassignweakeraccessprivileges waspublicprivatevoidfunction RTpolyTest java 16 cannotfindsymbolsymbol variablep1location classRTpolyTestp1 function 2errors可以看出 该程序中实例p2调用function 方法时会导致访问权限的冲突 第3章面向对象高级程序设计 3 1继承3 2多态性3 3抽象类和抽象方法3 4接口3 5内部类和匿名类 3 3抽象类和抽象方法 Java语言中 用abstract关键字来修饰一个类时 这个类叫做抽象类 一个abstract类只关心它的子类是否具有某种功能 并不关心该功能的具体实现 功能的具体行为由子类负责实现的 例如 publicabstractclassDrawing publicabstractvoiddrawDot intx inty publicvoiddrawLine intx1 inty1 intx2 inty2 用abstract来修饰一个方法时 该方法叫做抽象方法 与final类和方法相反 abstract类必须被继承 abstract方法必须被重写 3 3抽象类和抽象方法 当一个类的定义完全表示抽象的概念时 它不应该被实例化为一个对象 例如Java中的Number类就是一个抽象类 它只表示数字这一抽象概念 只有当它作为整数类Integer或实数类Float等的父类时才有意义 定义一个抽象类的格式如下 abstractclassabstractClass 由于抽象类不能被实例化 因此下面的语句会产生编译错误 newabstractClass 抽象类中可以包含抽象方法 为所有子类定义一个统一的接口 对抽象方法只需声明 而不需实现 因此它没有方法体 其格式如下 abstracreturnTypeabstractMethod paramlist 使用abstract的另一例子 abstractclassAA abstractvoidcallme voidmetoo System out println InsideA smetoo method classBBextendsAA voidcallme System out println InsideB scallme method publicclassAAbstract publicstaticvoidmain Stringargs AAcc newBB cc为上转型对象cc callme cc metoo 第3章面向对象高级程序设计 3 1继承3 2多态性3 3抽象类和抽象方法3 4接口3 5内部类和匿名类 3 4接口 3 4 1接口声明3 4 2使用接口的优点 3 4 1接口声明 从本质上讲 接口是一种特殊的抽象类 这种抽象类中只包含常量和方法的定义 而没有变量和方法的实现 通过接口使得处于不同层次 甚至互不相关的类可以具有相同的行为 接口其实就是方法定义和常量值的集合 它的优点主要体现在下面几个方面 1 通过接口可以实现不相关类的相同行为 而不需要考虑这些类之间的层次关系 2 通过接口可以指明多个类需要实现的方法 3 通过接口可以了解对象的交互界面 而不需了解对象所对应的类 接口把方法的定义和类的层次区分开来 通过它可以在运行时动态地定位所调用的方法 同时接口中可以实现 多重继承 且一个类可以实现多个接口 正是这些机制使得接口提供了比多重继承 如C 等语言 更简单 更灵活 而且更强劲的功能 3 4 1接口声明 Java不支持多继承性 即一个类只能有一个父类 单继承性使得Java类层次简单 易于程序的管理 为了克服单继承的缺点 Java使用了接口 一个类可以实现多个接口 使用关键字interface来定义一个接口 接口的定义和类的定义很相似 分为接口声明和接口体两部分 1 接口声明我们曾使用class关键字来声明类 接口通过使用关键自interface来声明 完整的接口定义格式如下 public interfaceinterfaceName extendslistOfSuperInterface 其中public修饰符指明任意类均可以使用这个接口 缺省情况下 只有与该接口定义在同一个包中的类才可以访问这个接口 extends子句与类声明中的extends子句基本相同 不同的是一个接口可以有多个父接口 用逗号隔开 而一个类只能有一个父类 子接口继承父接口中所有的常量和方法 通常接口名称以able或ible结尾 表明接口能完成一定的行为 例如Runnable Serializable 3 4 1接口声明 2 接口体接口体中包含常量定义和方法定义两部分 其中常量定义部分定义的常量均具有public static和final属性 其格式如下 returnTypemethodName paramlist 接口中只能进行方法的声明 而不提供方法的实现 所以 方法定义没有方法体 且用分号 结尾 在接口中声明的方法具有public和abstract属性 另外 如果在子接口中定义了和父接口同名的常量 则父接口中的常量被隐藏 例如 interfaceSummaryable finalintMAX 50 MAX具有public static final属性voidprintone floatx floatsum floatx floaty 上面这段程序可以以Summaryable java来保存 也可以写入其它Java程序中 3 4 1接口声明 3 接口的使用一个类通过使用关键字implements声明自己使用 或实现 一个或多个接口 如果使用多个接口 用逗号隔开接口名 如classCalculateextendsComputerimplementsSummary Substractable 类Calculate使用了Summary和Substractable接口 继承了Computer类 如果一个类使用了某个接口 那么这个类必须实现该接口的所有方法 即为这些方法提供方法体 需要注意的如下 1 在类中实现接口的方法时 方法的名字 返回类型 参数个数及类型必须与接口中的完全一致 2 接口中的方法被默认是public 所以类在实现接口方法时 一定要用public来修饰 3 另外 如果接口的方法的返回类型如果不是void的 那么在类中实现该接口方法时 方法体至少要有一个return语句 如果是void型 类体除了两个大括号外 也可以没有任何语句 3 4 2使用接口的优点 例3 9 使用多重接口的例子 MultInterfaces javainterfaceI1 abstractvoidtest inti interfaceI2 abstractvoidtest Strings publicclassMultInterfacesimplementsI1 I2 publicvoidtest inti System out println InMultInterfaces I1 test publicvoidtest Strings System out println InMultInterfaces I2 test publicstaticvoidmain String a MultInterfacest newMultInterfaces t test 42 t test Hello 第3章面向对象高级程序设计 3 1继承3 2多态性3 3抽象类和抽象方法3 4接口3 5内部类和匿名类 3 5内部类和匿名类 3 5 1内部类的定义3 5 2内部类特性3 5 3匿名类 3 5 1内部类的定义 简单地说 一个类被嵌套定义于另一个类中 称为嵌套类 在大多数情况下 嵌套类 静态的嵌套类除外 就是内部类 innerclass 包含内部类的类称为外部类 与一般的类相同 内部类具有自己的成员变量和成员方法 通过建立内部类的对象 可以存取其成员变量和调用其成员方法 例如下面的例子 pubicclassGroupOne intcount 外部类的成员变量publicclassStudent 声明内部类Stringname 内部类的成员变量publicvoidoutput 内部类的成员方法System out println this name 3 5 1内部类的定义 实际上 Java语言规范对于内部类有如下的规定 在另一个类或者一个接口中声明一个类 在另一个接口或者一个类中声明一个接口 在一个方法中声明一个类 类和接口声明可嵌套任意深度 从上面的规定中我们可以看出 内部类的定义是非常灵活的 3 5 2内部类特性 内部类有如下特性 一般用在定义它的类或语句块之内 在外部引用它时必须给出完整的名称 名称不能与包含它的类名相同 可以使用包含它的外部类的静态成员变量和实例成员变量 也可以使用它所在方法的局部变量 可以定义为abstract 可以声明为private或protected 若被声明为static 就变成了顶层类 不能再使用局部变量 若想在内部类中声明任何static成员 则该内部类必须声明为static Java将内部类作为外部类的一个成员 就如同成员变量和成员方法一样 因此外部类与内部类的访问原则是 在外部类中 通过一个内部类的对象引用内部类中的成员 反之 在内部类中可以直接引用它的外部类的成员 包括静态成员 实例成员及私有成员 3 5 2内部类特性 例3 10 内部类和外部类之间的访问本例的类GroupTwo中声明了成员变量count 内部类Student 实例方法output和main方法 在内部类Student中声明了构造方法和output方法 构造方法存取了外部类GroupTwo的成员变量count 程序运行结果 Johnsoncount 1本例演示嵌套的两个类之间的访问规则 即在外部类GroupTwo中 通过一个内部类Student的对象s1可以引用内部类中的成员 反之 在内部类Student中可以直接引用它的外部类的成员 如count 本例的外部类GroupTwo中有实例方法output 内部类Student中也有实例方法output 两者虽然同名 却表达不同含义 使用时 外部类GroupTwo的对象调用GroupTwo的output 如g2 output 内部类Student的对象调用Student的output 如s1 output 3 5 2内部类特性 publicclassGroupTwo 例5 10privateintcount 外部类的私有成员变量publicclassStudent 声明内部类Stringname publicStudent Stringn1 name n1 count 存取其外部类的成员变量 publicvoidoutput System out println this name publicvoidoutput 外部类的实例成员方法Students1 newStudent Johnson 建立内部类对象 s1 output 通过s1调用内部类的成员方法System out println count this count pub

温馨提示

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

评论

0/150

提交评论