第4章类的封装性、继承性、多态性及接口.ppt_第1页
第4章类的封装性、继承性、多态性及接口.ppt_第2页
第4章类的封装性、继承性、多态性及接口.ppt_第3页
第4章类的封装性、继承性、多态性及接口.ppt_第4页
第4章类的封装性、继承性、多态性及接口.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计 第4章类的封装性 继承性 多态性及接口 1 4 1封装性4 2继承性4 3多态性4 4抽象类4 5接口4 6内部类4 7泛型类 4 1封装性 目的限制在类的外部对类内部成员进行访问 只通过公共接口来访问类的成员数据 屏蔽细节 这是程序设计的基本思想 便于程序功能的扩展和程序的维护 封装类大多数变量都是私有的 变量通过他们自己类的方法修改 其它类都只与一个类中很少的几部分接口 若变量或方法为公有 它就是接口的一部分 其它类可以访问它 若为私有 它是实现的一部分 只有类自己的成员可以访问它 2 Java通过访问控制来实现封装性 访问控制通过4个访问修饰符实现 default 默认 public 公共 protected 保护 private 私有 访问修饰符限定了被修饰者的可见性 3 类成员 类 4 1 1类的访问控制 类的权限有两种 默认 修饰符为空 该类只能被自身所在的包中的类使用 public 该类能被所有包类的类使用 如果在一个源程序文件中 声明了若干个类的话 只能有一个类的权限关键字是public 这个类的名字应该和程序文件同名 main方法也应该在这个类中 否则程序无法执行 4 4 1 2类成员的访问控制 public 在任何地方 只要能访问到该类 即可访问到该成员 protected 该成员允许同一个包或该类的扩展子类访问 默认 该成员只能由同一个包中的其它类访问 private 类中的该成员只能由该类自己的成员调用 而无法被该类以外的其它类访问 声明局部变量不能包含访问权限修饰符 否则编译时将检查出错 5 4 1 3封装性的设计原则 基本思想 提供对外的通讯方式 封装内部的实现机制 增加内部实现部分的可替换性 减小类之间的耦合关系 方便模块划分 容易保证类内部数据间的一致性 从而提高软件的可靠性 基本原则 类常常是public 成员变量常常是private 构造方法一般是public 方法 get 与 set 是public 其它方法需要根据实际的需要而定 6 4 2继承性 继承也称为派生 是指一个新类可以继承其他已有类的所有成员 包括成员属性和成员方法 新类不但保留被继承过来的类的属性和方法 而且可以根据自身需要对类进行修改 添加新的成员属性和成员方法 被继承的类称为超类 父类 从超类派生出来 继承超类 的新类称子类 Java只支持单重继承 不支持多重继承 7 继承的层次结构 8 4 2 1继承的基本语法 修饰符 class子类名extends父类名 在Java中严格规定子类只能拥有一个直接父类 子类可以继承父类的所有属性和方法 P95 子类可以修改从父类继承来的成员 子类在继承父类成员的同时还可以创建自己的新成员 在Java中 一个类的定义中即使没有extends声明 但这个类仍然是一个类的子类 这个特殊的类是java lang Object 9 classFather intx 8 privateinty 9 publicdoublez 10 0 voidprintS Strings System out println s classSonextendsFather Strings Hello world 10 publicclassTest publicstaticvoidmain Stringargs Sona newSon System out println a z System out println a x a printS a s System out println a y 10 08Hello world 疑问 子类只继承父类的非私有成员 P95 继承 特殊类的对象拥有其一般类的全部属性与服务 称作特殊类对一般类的继承 李代平 软件工程 北京 冶金工业出版社 2002 8 146一个子类对象将总是包含一个完整的父类对象 即拥有它的全部数据成员和方法 IvorHorton著 潘晓雷 于浚泊等译 Java2入门经典 北京 机械工业出版社 2006 9 210 11 classA privateintid voidsetId inti id i intgetId returnid classBextendsA publicclassTest publicstaticvoidmain String args Bb newB b setId 8 System out println b getId 12 实际上 public protected default private和继承没有关系 他们对类成员的限制只是在成员的可见性上 public允许来自任何类的访问 protected允许来自同一包中的任何类以及该类的任何地方的任何子类的方法访问 default允许来自同一个包中的类的访问 private只允许来自该类内部的方法访问 不允许任何来自该类外部的访问 13 关于成员变量的继承 父类的任何成员变量都是会被子类继承下去的 这些继承下来的私有成员虽对子类来说不可见 但子类仍然可以用父类的方法操作他们 这样的设计有何意义呢 我们可以用这个方法将我们的成员保护得更好 让子类的设计者也只能通过父类指定的方法修改父类的私有成员 这样将能把类保护得更好 这对一个完整的继承体系是尤为可贵的 14 子类对象的内存 15 例 派生子类 16 域的隐藏 如果子类中定义了一个与从父类那里继承来的成员变量完全相同的变量 则父类那里继承来的成员变量将被隐藏 17 例 classFather intx 8 classSonextendsFather intx 9 voidprintS System out println x publicclassTest publicstaticvoidmain Stringargs Sona newSon a printS 18 子类隐藏父类的变量只是使之在子类中不可见 父类的同名变量在子类中仍然占有自己独立的内存空间 如要访问被隐藏的父类变量 可通过两条途径实现 使用super 变量名 调用从父类继承的方法操作的是从父类继承的变量 19 classFather intx 8 voidprintF System out println x classSonextendsFather intx 9 voidprintS System out println x System out println super x publicclassTest publicstaticvoidmain Stringargs Sona newSon a printS a printF 20 4 2 2super关键字 super表示对某个类的超类的引用 如子类和超类有同名的域或方法 则 super 变量名super 方法名 表示引用超类的成员 如无super则表示子类中的同名成员 21 继承关系中对成员的访问 就近原则 在子类中访问属性和方法时将优先查找自己定义的属性和方法 如果该成员在本类存在 则使用本类的 否则 按照继承层次的顺序到其祖先类查找 this关键字特指本类的对象引用 使用this访问成员则首先在本类中查找 如果没有 则到父类逐层向上找 super特指访问父类的成员 使用super首先到直接父类查找匹配成员 如果未找到 再逐层向上到祖先类查找 22 终止继承 出于安全性方面的考虑 要避免子类继承超类的某个方法 可以使用 final 关键字来使继承终止 这样使此方法不会在子类中被覆盖 即子类中不能有和此方法同名的方法 不能被继承的类称为最终类 如 finalclassLast 用final说明的成员方法为最终方法 如 publicfinalvoidprintsuper 23 4 2 3构造方法的 继承 Java保证当创建一个类的实例时 一定会调用该类的构造方法 同时 它还保证当创建子类的实例时 父类的构造方法也同样要被调用 为了保证第二点 Java必须确保每个构造方法都会调用它父类的构造方法 父类的构造方法构造对象的父类部分 而子类的构造方法构造子类部分 所以 如果构造方法的第一条可执行语句没有通过this 或super 显式地调用其它构造方法 那么Java会默认插入一条方法调用super 它调用父类中不带参数的构造方法 如果父类不包括不带参数的构造方法 那么这个默认的调用就会导致编译错误 24 classFather inta publicFather inte a e classSonextendsFather intb intc publicSon super 1 publicSon intm intn inth super m b n c h publicvoidprintSon System out println a b c 25 publicclassTest publicstaticvoidmain Stringargs SonA newSon SonB newSon 3 2 5 A printSon B printSon 构造方法的调用顺序 按继承顺序依次调用父类的构造方法 直到到达本子类 依次执行本子类成员对象的构造方法 最后 执行本子类的构造方法 26 classPerson publicPerson System out print A publicPerson Strings this System out print B classStudentextendsPerson publicStudent System out print C publicclassWhoextendsPerson Studentstudent newStudent publicWho super ok System out print E publicstaticvoidmain Stringargs Whow newWho 27 4 3多态性 多态性是指同一个名字的若干个方法 有不同的实现 即方法体中的代码不一样 多态的两种表现形式 方法重载overloading 静态多态性 方法覆盖overriding 动态多态性 28 4 3 1方法的重载 在Java中每个方法都有签名 就是方法名以及参数的个数和类型 如果两个方法参数的个数或类型不同 它们可以具有相同的名字 这种现象叫做重载 当调用方法时 编译器通过比较自变量参数的个数和类型来查找匹配得最好的方法 签名不包括返回类型或者抛出异常的列表 所以不能通过这些来重载方法 对于重载的多个同名方法 在编译时能够确定执行同名方法中的哪一个 故也称为编译时多态性 29 classFather intx 5 intaddX intb returnx b classSonextendsFather intaddX intb intc returnx b c StringaddX Strings returnx s 30 publicclassTest publicstaticvoidmain Stringargs Sona newSon System out println a addX 2 System out println a addX 2 3 System out println a addX 2 71052 一般地 重载的方法应当具有相似的行为 功能 classShapeArea publicdoublearea floatr returnMath PI r r publicdoublearea floata floatb returna b publicdoublearea floata floatb floatc floatd d a b c 2 returnMath sqrt d d a d b d c 31 在类ShapeArea中声明三个同名方法area 求圆 矩形和三角形的面积 4 3 2方法的覆盖 在子类和超类中有同名的方法 参数也相同 子类中的方法覆盖超类的方法 如果超类和子类有同名且参数相同的方法 那么超类的对象调用超类的方法 子类的对象调用子类的方法 通过覆盖可以使同名的方法在不同层次的类中有不同的实现注意 子类中重写的方法和父类中被重写的方法要具有相同的名字 相同的参数表和相同的返回类型 只是函数体不同 32 classFather intx 8 intaddX intb returnx b classSonextendsFather intaddX intc returnx c 10 publicclassTest publicstaticvoidmain Stringargs Sona newSon System out println a addX 2 33 调用被覆盖的父类方法 classSonextendsFather intaddX intc returnsuper addX c 方法覆盖的原则 子类方法的名称 参数签名和返回类型必须与其父类的方法的名称 参数签名和返回类型一致 子类方法不能缩小父类方法的访问权限 子类方法不能抛出比父类方法更多的异常 方法覆盖只存在于子类和父类 包括直接父类和间接父类 之间 在同一个类中方法只能被重载 不能被覆盖 父类的静态方法不能被子类覆盖为非静态的方法 反之亦然 子类可以定义与父类的静态方法同名的静态方法 以便在子类中隐藏父类的静态方法 父类的私有方法不能被覆盖 父类的抽象方法可以被子类覆盖 子类实现父类的方法或重新声明父类的抽象方法 34 确保是覆盖而非重载 classFather intx 8 intaddX intb returnx b classSonextendsFather OverrideintaddX intc returnx c 10 35 Java注解 annotation Override确保子类覆盖 重写 超类方法 3 2 3动态多态性 一个特定的变量可以用于引用不同类型的对象 并且自动调用该变量引用的特定类型对象的方法 这样就使得一个方法的调用根据该调用所用到的不同对象类型而响应不同的操作 如果在编译时不能确定 只能在运行时才能确定执行多个同名方法中的哪一个 则称为运行时多态性 动态多态性 36 classStudent Stringname publicStudent Stringn name n publicStringtoString returnname 37 classUndergraduateextendsStudent Stringteacher publicUndergraduate Stringn Stringt super n teacher t publicStringtoString returnname 的班主任是 teacher classPostgraduateextendsStudent Stringdirector publicPostgraduate Stringn Stringd super n director d publicStringtoString returnname 的导师是 director 38 publicclassTest publicstaticvoidprint Students System out println 姓名 s name publicstaticvoidmain String args Studenta newUndergraduate 小张 张老师 Studentb newPostgraduate 小王 李教授 Undergraduatec newUndergraduate 小赵 钱老师 System out println a toString System out println b toString print c 39 小张的班主任是张老师小王的导师是李教授姓名 小赵 使用多态时必须满足的条件 派生类对象的方法调用必须通过一个基类类型的变量进行 调用的方法必须在派生类中被定义 调用的方法也必须被声明为基类的一个成员 基类和派生类中对应的方法的签名必须相同 派生类的方法的访问说明符不能比基类有更多的限制 40 4 4抽象类 Abstract关键字可修饰类和方法 被修饰的类称为抽象类 被修饰的方法称为抽象方法 抽象类中的方法定义可以没有方法体 只有方法声明 抽象类没有对象 也就是说 一个抽象类不能通过new操作符直接实例化 被abstract修饰的方法在非抽象的子类中必须有具体的实现 41 抽象类是专门设计来让子类继承的类 抽象类提供一个类型的部分实现 可以有实例变量 构造方法 抽象方法和具体方法 抽象类作为系统中多个子类的共同父类 它所体现的是一种模板式设计 抽象类作为多个子类的抽象父类 可以被当成系统实现过程中的中间产品 这个中间产品已经实现了系统的部分功能 但这个产品依然不能当成最终产品 必须有更进一步的完善 这种完善可能有几种不同方式 42 声明抽象类和方法格式 abstractclass类名 成员变量 方法 方法体 定义一般方法abstract方法 定义抽象方法 对于成员方法 不能同时用static和abstract说明 对于类 不能同时用final和abstract说明 有抽象方法的类一定是抽象类 抽象类不一定有抽象方法 43 abstractclassShape protectedStringname publicShape Stringname this name name abstractprotecteddoublegetArea classRectangleextendsShape doublewidth length publicRectangle Stringname doublewidth doublelength super name this width width this length length publicdoublegetArea returnwidth length 44 publicclassTest publicstaticvoidmain Stringargs Rectangler newRectangle 矩形 10 0 23 5 System out println r getArea 4 5接口 接口 是抽象类的概念 实际上是一组相关常量和 或 抽象方法的集合 并且在大多数情况下 它只包含方法 接口不会定义方法是什么 而只定义方法的形式 即名称 参数和返回类型 因此接口中的方法都是没有方法体的抽象方法 接口中只能定义staticfinal域 接口定义的仅仅是实现某一特定功能的一组方法的对外接口和规范 而并没有真正地实现这个功能 接口的功能实现是在 继承 了这个接口的各个类中完成的 由这些类来具体定义接口中所有抽象方法的方法体 通常把对接口的 继承 称为 实现 45 46 接口中的常量在默认状态下总是public static和final类型的 接口中的方法在默认状态下总是public 和abstract类型的 定义接口的格式 47 publicinterface接口名 extends父接口名列表 常量域声明 publicstaticfinal 域类型域名 常量值 抽象方法声明 publicabstract 返回值类型方法名 参数列表 接口的实现 一个类要实现接口时 要注意下列问题 在类的声明部分 用implements关键字声明该类将实现哪些接口 如果实现了某个接口的类不是abstract的抽象类 则在类的定义部分必须实现指定接口的所有抽象方法 即为所有抽象方法定义方法体 如果实现了某个接口的类是abstract的抽象类 则它可以不实现指定接口的所有抽象方法 接口的抽象方法的访问控制符为public 所以类在实现方法时 必须显式地使用public 实现接口的类要实现接口的全部方法 如果不需要某个方法 也要定义成一个空方法体的方法 如 publicvoid方法名 48 例 interfaceCalArea doublePI 3 14 doublegetArea classCircleimplementsCalArea doubler publicCircle doubler this r r publicdoublegetArea PI 3 14159 错误 pi隐含为final和static的returnPI r r 49 classSquareimplementsCalArea doubles publicSquare doubles this s s publicdoublegetArea returns s publicclassTest publicstaticvoidmain Stringargs Circlea newCircle 3 Squareb newSquare 3 System out println a getArea System out println b getArea 50 例 interfaceRemote voidopen voidclose classTvimplementsRemote publicvoidopen System out println 打开电视 publicvoidclose System out println 关闭电视 51 classVcdimplementsRemote publicvoidopen System out println 打开VCD publicvoidclose System out println 关闭VCD publicclassTest publicstaticvoidmain Stringargs Remoter newTv r open r close r newVcd r open 52 理解接口 接口作为系统与外界交互的窗口 体现的是一种规范 对接口的实现者而言 接口规定了实现者必须向外提供哪些服务 以方法的形式来提供 对于接口的调用者而言 接口规定了调用者可以调用哪些服务 以及如何调用这些服务 就是如何来调用方法 当在一个程序中使用接口时 接口是多个模块间的耦合标准 当在多个应用程序之间使用接口时 接口是多个程序之间的通信标准 53 接口和抽象类的区别 接口可以多重继承 抽象类不可以抽象类内部可以有实现的方法 接口则没有实现的方法接口与实现它的类不构成类的继承体系 即接口不是类体系的一部分 因此 不相关的类也可以实现相同的接口 而抽象类是属于一个类的继承体系 并且一般位于类体系的顶层 接口的优势 通过实现多个接口实现多重继承 能够抽象出不相关类之间的相似性 创建类体系的基类时 若不定义任何变量并无需给出任何方法的完整定义 则定义为接口 必须使用方法定义或变量时 考虑用抽象类 54 4 6内部类 大部分时候 我们把类定义成一个独立的程序单元 在某些情况下 我们把一个类放在另一个类的内部定义 这个定义在其他类内部的类就被称为内部类 包含内部类的类被称为外部类 内部类有如下作用 内部类提供了更好的封装 内部类方法可以访问外部类私有数据 55 内部类的类名只用于定义它的类或语句块之内 在外部引用它时必须给出带有外部类名的完整名称 并且内部类的名字不允许与外部包类的名字相同 内部类可以是抽象类或接口 若是接口 则可以由其它内部类实现按照内部类是否含有显示的类名 可将内部类分为 实名内部类局部内部类匿名内部类内部类一般用于定义与其外部的对象有很强关联的对象 并且两者之间通常有紧密的联系 当定义内部类的时候 它与其他类成员一样 会成为外部类的一个成员 也可以具有访问属性 并且外部类对它的访问性也是同样取决于这个属性值 56 4 6 1实名内部类 格式 类修饰词表 class类名 extends父类名 implements接口名列表 类体 实名内部类的封装性增加了保护模式和私有模式 即实名内部类的修饰词可以是protected或private实名内部类的修饰词可以是static 称为静态实名内部类没有static修饰的内部类 称为不具有静态属性的实名内部类 它的成员域若有静态属性 则必须有final属性 但不能有静态属性的方法 57 创建实名内部类 创建静态实名内部类格式 new外部类名 实名内部类名 构造方法调用参数列表 创建不具有静态属性的实名内部类格式 外部类表达式 new实名内部类名 构造方法调用参数列表 58 59 publicclassTest JFrameframe newJFrame 测试窗口 窗口JPanelpanel newJPanel 面板privateJLabellabel newJLabel 没有操作 标签privateJButtonbutton newJButton 确定 按钮privateclassButtonListernerimplementsActionListener 监听器类 OverridepublicvoidactionPerformed ActionEvente label setText 点击了按钮 60 publicTest panel add label 将标签加到面板中panel add button 将按钮加到面板中frame add panel 将面板加到窗口中button addActionListener newButtonListerner frame setBounds 200 100 400 300 frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame setVisible true publicstaticvoidmain Stringargs newTest 4 6 2局部内部类 如果把一个内部类放在方法里定义 则这个内部类就是一个局部内部类 局部内部类仅在该方法里有效 61 1 在局部内部类前不能用public protected和private 只允许是abstract final或不加 2 可以定义与外部类同名的变量 3 不可以定义静态变量和方法 4 可以访问外部类的局部变量 但是变量必须是final的 5 可以访问外部类的所有成员 62 63 classOutter Stringstr abc inta 10 publicvoidsample1 finalintb 12 Stringstr3 123 classInner 不能用public protected和private修饰类inta 12 staticStringstr3 aaa 内部类中不能定义STATIC变量 publicvoidsample2 System out println b 局部常量bSystem out println str 外部类成员变量strSystem out println Outter this a 外部类成员变量aSystem out println a 内部类成员变量a 不能引用另一方法中定义的内部类中非终态变量str3 System out println 外部类成员变量str3的值 str3 newInner sample2 publicclassTest publicstaticvoidmain String args Outteroutter newOutter outter sample1 4 6 3匿名类 有时仅仅为了在程序中定义一个对象而定义类 而且这个对象的唯一作用就是将它作为实参传递给方法 在这种情况下 只要类扩展已存在的类或者实现接口 就可以选择将其作为匿名类 匿名类没有名字 类的定义和一个实例的创建同时进行 也就是说定义实际上是写在new的代码中 而不是拥有class关键字 匿名类不能有修饰符 也不能定义构造方法 64 定义匿名内部类的格式 new父类名 父类型的构造方法的调用参数列表 类体 65 例1 interfaceA voidprint publicclassTest publicstaticvoidmain Str

温馨提示

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

评论

0/150

提交评论