ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:50.30KB ,
资源ID:7820935      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-7820935.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(5 继承JavaWord格式文档下载.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

5 继承JavaWord格式文档下载.docx

1、 后果 代码冗长 如果员工类 Employee 的属性或方法有变化,两个类都需要进行修改 可维护性差结论 采用继承来表达员工类 Employee 和经理类 Manager 之间的联系继承的语法 使用 Java 的关键字 extends 表示继承,扩展 语法: class SonClass extends BaseClass / SonClass 的成员 extends 前为子类,后为父类 (基类/超类) 表示前者从后者继承采用继承 经理类不需要定义员工类已经定义了的属性和方法,采用继承机制自动就拥有父类的属性和方法 修改 TestEmployeeManager.java 成为 TestExte

2、nds.java继承的结果 采用继承后 建立了员工类 Employee 和经理类 Manager 之间这种特殊的联系 优点: 代码更简洁 员工类 Employee 中已经定义的属性和方法,经理类 Manager 会自动拥有 一旦需要进行修改,修改员工类 Employee 的成员,经理类 Manager 可直接使用修改后的成员 而对经理类 Manager 的修改则不会对员工类 Employee 产生任何影响 可维护性较高 但是,继承从一定程度上打破了封装的结果类 子类在一定程序上依赖于父类的实现 如果父类进行了修改,有可能导致原来已经定义好的子类不能正常工作 父类的修改除了影响自身之外,还可能会

3、影响到它所有直接或间接的子类直接/间接父类 直接父类 class Manager extends Employee 则 Employee 是 Manager 的直接父类 Manager 是 Employee 的直接子类 Employee 的直接父类是谁呢? Object 因此 Object 是 Manager 的间接父类 Manager 是 Object 的间接子类继承关系图 UML 语言 统一建模语言 Unified Modeling Language 图形式的语言 用于面向对象的分析与设计 OOA OOD Java 则用于 OOP直接父类的个数 单继承:只允许有一个直接父类 多重继承:允许

4、有多个直接父类 Java 语言只支持单继承 C+ 则支持多继承,更复杂,更难学习 Java 中所有的类构成了一棵树 称之为 继承结构,hierarchy 树的根节点是 Object所有成员都自动拥有吗? 子类能把父类的所有成员都继承过来吗? 答案是否定的 以下成员不能被继承: private 成员 静态成员 构造器 以上成员均包括成员变量和成员方法继承与组合 继承:父类和子类是一般与特殊的关系 除此之外,现实世界中还有一种联系也很常见,即整体和局部的关系,例如: 电动剃须刀是一个包含电源子系统的组合系统 电动剃须刀类 Shaver 电源类 Power 后者又有两个子类: 电池类 Battery

5、,交流电源类 AcPowerShave-Power 组合 示意图组合的实现 在定义类时,把局部类的一个对象作为整体类的一个成员变量即可 例如,TestComposition.java 中 类 Shaver 的定义中包含: private Power power; public void Shaver(Power power) this.power = power; public void setPower(Power power) 继承与组合的选择 两个类之间的关系 取决于现实世界中二者是一般和特殊的关系,还是整体和局部的关系 当然,两个类之间的关系 除了继承与组合之外 还可以有其它类型的关系

6、 例如,如果类 A 使用类 B 提供的服务 则称为类 A 依赖 类 B 依赖,dependencysuper super 概述 通过 super 访问父类成员变量 通过 super 调用父类成员方法 通过 super 调用父类构造器 构造子类对象 super 与 thissuper 概述 super:Java 语言的关键字 用来在子类的成员方法中访问父类的成员 可以访问的成员包括: 成员变量 普通的成员方法 在通过 super 访问上述三种成员时 其语法不相同,要求也不一样通过 super 访问父类成员变量 子类的成员方法中可以通过 super 来访问父类的成员变量 语法: super.成员变

7、量名称 限制: 只能在子类的非静态成员方法中使用 super 在子类的构造器中亦可访问权限控制 尽管是子类和父类的继承关系 子类依然不能访问父类的 private 成员 通过 super 来访问亦然 修改 TestExtends.java 把父类的成员变量 id 设为 private 权限 重新编译程序通过 super 调用父类成员方法 在子类的非静态成员方法中通过下述形式可以调用父类的成员方法: super.成员方法名称(参数列表) 例如,子类 Manager 没有定义 print() 方法 采用的是从父类 Employee 继承的方式 但是这个继承过来的 print() 方法的功能与 Ma

8、nager 所要求的还有一定的距离 没有打印出经理所承担的责任解决方法 子类 Manager 再定义一个 print() 方法 在该方法中,使用 super.print() 来调用父类的 print() 方法,之后自己来打印出相应的职责 responsibility public void print() super.print(); System.out.println( t 职责是 + this.responsibility);如果不使用 super 把 super.print() 改为 print() 试一试 看看会发生什么情况 如果删去 super 那么就意味着调用 this.prin

9、t() 这种方法自己直接调用自己的方式 称之为 递归调用 之 直接递归调用 由于程序没有控制如何退出,因此造成方法调用的堆栈层次太深从而产生堆栈溢出 java.lang.StackOverflowError另一种变化 把子类 Manager 中的两条语句互换位置 变成了 重新编译程序结果 程序通过了编译,也可以正常运行 职责的输出在员工的工号、姓名、部门之前 虽然通过了编译,也可以运行 但是,在大多数情况下 子类的方法调用父类成员方法的语句 一般都做为子类方法的第一条语句出现通过 super 调用父类构造器 在子类的构造器中,可以通过 super 来调用父类的构造器 super(参数列表);

10、例如 可以把子类 Manager 构造器的前三行 修改为通过 super 来调用父类的构造器 子类 Manager 的构造器变成了:public Manager(String id, String name, String department, String responsibility) super(id, name, department); this.responsibility = responsibility; 把 id、name 和 department 的初始化工作 交给了父类的构造器来完成调用两次? 在 super(id, name, department) 之前再加上一个对

11、父类构造器的调用 super() 产生了编译错误srcTestExtends.java:29: 对 super 的调用必须是构造器中的第一个语句 1 错误互换位置? 得到的编译错误与前面相同说明 在子类的构造器中通过 super 可以调用父类的构造器 如果有该调用 那么必须是子类构造器的第一条语句 因此最多只能调用一次 不能在子类的非构造器中通过 super 来调用父类的构造器构造子类对象 由于子类的对象不仅具有本类定义的成员变量和成员方法,还有其父类定义的成员变量和成员方法,因此构造子类的对象,比构造一个简单的类的对象要复杂得多 例如,创建一个经理类 Manager 的对象 该对象不仅有成员

12、变量 responsibility 还有从父类继承过来的成员变量 id、name 和 department 以及一个成员方法 print() 虽然要完成的工作比较多 但是程序员创建该类对象的方法依然与以前完全相同: Manager m; m = new Manager(“1001”, “john”, “技术部”, “负责技术部事宜”); 还是通过 new 来调用相应的构造器 来完成对象的构造工作调用父类构造器 为了完成子类对象的构造,子类的构造器一定会调用父类的某个构造器 这个调用可以由程序员通过 super 来完成 那如果程序员没有使用 super 来调用父类的构造器呢? 如果程序员没有明确

13、写出调用父类构造器的语句,那么编译器会在子类构造器的第一条语句之前默认调用父类无参数的构造器 这要求父类必须有一个无参数的构造器,如果没有,则产生编译错误,不能通过编译修改程序 修改程序 删去子类 Manager 的构造器中通过 super 来调用父类构造器的语句,使用赋值语句来完成 然后注释父类 Employee 的无参数构造器编译错误找不到符号符号:构造器 Employee()位置:类 Employee 错误指向子类 Manager 构造器的开始大括号 由于该构造器并未明确调用父类的构造器,因此编译器会自动在此构造器的开始处运行以下语句: super(); 而父类 Employee 并没有

14、一个无参数的构造器,因此产生了上述编译错误措施 父类: 保证有一个无参数的构造器 另外,根据成员变量的具体情况 来编写数个有参数的构造器 子类: 在构造器中明确调用父类的构造器super 与 this 都是 Java 语言的关键字 都只能在类的非静态成员方法中使用 this: 访问本类的成员访问父类的成员 上述成员均包括:方法覆盖 方法的继承 方法的覆盖方法的继承 对于子类来说,通过继承可以自动获得父类已经定义好的成员,包括成员变量和成员方法 子类 Manager 无需自己定义就拥有了 print() 方法 这是继承的优点继承的方法 从父类继承的方法是父类定义的 其方法体是按照父类的具体情况

15、(例如成员变量情况) 来编写的 对于子类则不一定完全合适 从父类 Employee 继承过来的 print() 方法没有输出成员变量 responsibility 的值 因为类 Employee 没有这个成员变量只能被动继承吗? 继承过来的方法对于子类而言是只读的吗? 不能进行修改吗? 对于从父类继承过来的方法 如果不能完全满足子类的需要 子类可以重新定义该方法 称为 方法的覆盖,重写,override方法的覆盖 把父类的方法重新定义一遍 方法签名相同,只是方法体不同 方法签名 方法的头部 包括访问权限、返回类型、方法的名称以及方法的参数列表重新定义 print() 方法 在子类 Employ

16、ee 中重新定义 print() 方法 System.out.println(“ 该经理的工号是 + super.id); t 姓名是 + super.name); t 部门是 + super.department);拿来主义 子类在覆盖父类的方法时,如果有一部分工作父类被覆盖的方法已经完成了,子类的方法是在父类方法的基础上增加一些功能,那么子类的方法可以通过 super 来调用父类被覆盖的方法 优点 提高代码的可重用性 减少代码行数使用 super 调用的 print() 方法 使用 super 来调用父类的方法子类 Manager 的 print() 方法变成了public void pr

17、int() super.print();System.out.println(小 bug 小 bug: 原来输出是;该经理的工号是 现在输出是:该员工的工号是 原因: 成员方法 print() 功能较多 不仅打印员工的详细信息 而且还打印员工的类型 解决方案: 用多个方法来实现打印功能,例如 printType() 用来打印员工的类型 printInfo() 用来打印员工的详细信息解决方法:父类 父类 Employee 增加两个方法 public void printType(); public void printInfo(); 然后把 print() 方法修改成: this.printTy

18、pe(); this.printInfo();子类 子类 继承父类的 print() 方法 覆盖父类新增加的两个方法 另存为 TestExtendsPrint.java 重新编译,运行小结 重新进行了成员方法的设计与实现增加了两个方法 printType() 及 printInfo() 在 print() 方法中调用上述两个方法继承了父类的 print() 方法 覆盖了父类新增加的两个方法 客户:即包含 main() 的类 未做任何修改 父类、子类关于打印的实现对于使用者是透明的 程序的可维护性较高方法设计 一个方法完成一个功能 但是功能也有大小之分 功能之间也有包含的关系 粒度 根据实际情况

19、进行功能的划分、确定 一个方法完成一个指定的不可再分的功能 不可再分:原子性,atom 覆盖父类的方法时 子类的方法与父类的方法必须具有 相同的返回类型 相同的方法名称 相同的参数列表 访问权限呢? 相同肯定是可以的 但不是必须得具有相同的访问权限 子类的方法不能比父类的方法访问更严格 严格? 宽松? 访问权限控制禁止方法被覆盖? 一个类作为父类可以被继承 某一个方法已经实现了预期功能 并且不想让子类继承时覆盖这个方法 怎么办呢? 不想让一个变量初始化后再被赋值,即 常量 不想让一个类可以被继承,即 禁止类被继承 解决方案,尽在 Java 关键字:finalfinal 修饰符 final 概述

20、 final 变量 final 方法 final 类final 概述 final: 最终的,不能改变的 可以修饰: 变量 成员方法 类final 变量 变量用 final 修饰则成为常量 特点:一旦初始化后则不能被再次赋值 其值保持不变 final 可以修饰的变量包括: 静态成员变量 非静态成员变量,即 实例变量 局部变量 方法的形式参数final 静态成员变量 无需创建该类即可使用的常量 例如,圆周率在类 Math 中已经进行了定义 public static final double PI = 3.14159265358979323846; 根据命名规范,常量的名称全部大写 如果有多个单词

21、,之间以下划线 _ 隔开 例如,类 Integer 中的静态成员变量定义 public static final int MIN_VALUE = 0x80000000; public static final int MAX_VALUE = 0x7fffffff; 其中 0x 开头代表 16 进制查看 Java API 源代码 把 JDK 安装目录下的 src.zip 解压缩 产生 src 目录 该目录中即为 Java API 类的源代码 因为类的数量很多 因此是按子目录分开存放的 类 Math、Integer 均在子目录 java/lang 下 参观高手编写的程序 提高编程能力的途径之一,临

22、摹使用 final 静态成员变量 通过类名加点号.再加成员变量名称即可访问 例如,定义类圆 Circle private double radius; public Circle(); public Circle(double radius); public double getRadius(); public void setRadius(double radius); public double getPerimeter(); public double getArea(); 示例:TestCircle.java修饰符 类 Math 中成员 PI 的修饰符有 public: 表示任何地方都

23、可以访问该变量 static: 静态的 表示无需创建 Math 类的对象即可访问 final: 最终的 表示这是一个常量,不能再被赋值 double:双精度浮点类型 说明该常量的数据类型是 double 类型final 实例变量 例一 Java 语言中有 8 种基本数据类型 每一种都有对应的类 该类封装了一个对应的基本数据类型做为其成员变量 例如,类 Integer 封装了一个 int 类型的值 private final int value; 这是一个私有的 final 实例变量封装类基本数据类型booleanBooleancharCharacterbyteByteshortShortint

24、IntegerlongLongfloatFloatdoubleDouble 例一 (续) 该实例常量的初始化工作由构造器完成 public Integer(int value) this.value = value; 该常量一旦初始化后,其值不能改变 因此,所有的封装类都是 不可变类 不可变,immutable 实际上,所有的封装类都有一个名称为 value 的 private final 实例变量,所不同的是不同的封装类中该变量的类型不同 例如,类 Boolean 中该实例常量的声明为 private final boolean value; 也由构造器进行初始化 public Boolean(boolean value) this.value = value;final 实例变

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2