Java2 lesson The aim of this lesson is concept and method. ( 赵 卓 宁 ) 教 学 计 划 学 习 进 度 Java 3 6.1~6.34 内 容 介 绍 教 材 内 容 : 第 六 课 描 绘 的 层 次 和 关 系 主 要 议 程 1. 的 复 用 2. 的 继 承 3. 关 于 多 态 4. 应 用 约 束 ( 封 装 ) 5. 接 口 L6.1 的 复 用 复 用 的 目 的 OOP 的 优 点 之 一 是 : 可 以 实 现 复 用 设 计 良 好 功 能 强 大 灵 活 而 易 于 扩 展 的 设 计 高 度 可 复 用 的 相 当 困 难 v 一 旦 成 功, 你 的 软 件 可 以 做 到 设 计 良 好 和 易 于 维 护 思 想 寻 找 代 码 中 高 度 可 结 合 的 部 分 和 方 法 应 该 处 理 非 常 明 确 而 易 于 描 述 的 任 务 抽 取 一 般 化 信 息 (SB6.6) 复 用 的 实 现 继 承 L6.2 的 继 承 关 系 型 OOP 中, 执 行 的 方 法 是 基 于 明 确 了 之 间 关 系 的 基 础 之 上 的 v 而 过 程 化 的 方 法 强 调 操 纵 数 据 的 行 为, 并 不 关 心 行 为 间 的 关 系 关 系 型 (TR5.2) Kind-Of 种 关 系 Is-A 是 关 系 Has-A / Part-Of 有 关 系 / 部 分 关 系 L6.2 的 继 承 继 承 继 承 是 面 向 对 象 程 序 设 计 语 言 的 一 个 基 本 特 征 通 过 继 承 可 以 实 现 代 码 的 复 用 超 与 子 被 继 承 的 其 属 性 的 称 为 超 从 超 中 继 承 属 性 和 方 法 的 为 子 超 与 子 的 关 系 (TR5.4) 超 和 子 共 享 超 的 属 性 子 不 能 继 承 超 的 构 造 成 函 数 ( 编 译 器 的 原 因 ) 了 并 不 局 限 于 超 提 供 的 方 法, 可 以 有 不 同 于 继 承 自 超 的 属 于 子 的 成 员 数 据 和 方 法 继 承 帮 助 我 们 :(SB6.7) 减 少 代 码 的 冗 余 容 易 维 护 代 码 增 加 更 多 方 法 到 了 从 而 扩 大 现 成 的 的 功 能 继 承 的 型 单 重 继 承 子 从 父 ( 超 ) 中 派 生 出 来 多 重 继 承 子 派 生 自 一 个 以 上 的 派 生 继 承 所 有 超 大 型 的 成 员 数 据 和 方 法 Java 不 支 持 多 重 继 承 v 也 就 是 说 : 每 个 只 能 拥 有 一 个 超 v 但 程 序 员 能 通 过 接 口 利 用 多 重 继 承 的 优 势 继 承 的 实 现 语 法 (SB6.9) Public class < 子 名 > extends < 超 名 > 说 明 如 果 缺 省 extends 子 句 v 则 该 为 java.lang.object 的 子 子 可 以 继 承 父 中 v 访 问 权 限 设 定 为 public protected default 的 成 员 变 量 和 方 法 v 但 是 不 能 继 承 访 问 权 限 为 private
的 成 员 变 量 和 方 法 何 时 继 承 何 时 选 择 继 承 性? 一 个 很 好 的 经 验 : B 是 一 个 A 吗? 如 果 是 则 让 B 做 A 的 子. 常 犯 的 错 误 A 有 一 个 B 吗? 例 如 让 汽 车 轮 子 成 为 汽 车 的 子 是 错 误 的 覆 盖 方 法 方 法 覆 盖 (overriding) 指 子 对 父 的 方 法 进 行 改 写 子 覆 盖 的 方 法 同 父 的 方 法 要 保 持 下 面 的 统 一 : v Name v Return type v Argument list 另 外 v 覆 盖 的 方 法 不 能 比 被 覆 盖 的 方 法 具 有 更 少 的 访 问 权 限 v 覆 盖 的 方 法 不 能 比 超 方 法 有 更 多 的 异 常 覆 盖 方 法 举 例 TR5.13 构 造 函 数 的 继 承 构 造 函 数 不 能 被 继 承 调 用 用 超 的 构 造 函 数 (TR5.15) v super 关 键 字 v super() 方 法 使 用 和 构 造 函 数 一 起 的 super 关 键 字 v super() 方 法 必 须 是 子 构 造 函 数 的 第 一 语 句 v 向 super() 传 递 参 数, 调 用 特 定 构 造 函 数 v 如 果 缺 省 构 造 函 数 不 可 用, 编 译 器 产 生 错 误 构 造 函 数 的 继 承 使 用 和 构 造 函 数 一 起 的 super 关 键 字 Super 指 这 个 对 象 的 父 super 用 来 引 用 父 中 的 方 法 及 变 量 数 据. Java 中 通 过 super 来 实 现 对 父 成 员 的 访 问 用 来 访 问 父 被 隐 藏 的 成 员 变 量, 如 : super.variable 附 this this 用 来 调 用 父 中 被 重 写 的 方 法, 如 : super.method ( [paramlist] ); 用 来 调 用 父 的 构 造 函 数, 如 : super( [paramlist] ); this 指 自 己 这 个 对 象 this 的 作 用 是 要 将 自 己 这 个 对 象 当 作 参 数, 传 送 给 别 的 对 象 中 的 方 法. 多 态 多 态 并 不 是 面 向 对 象 程 序 员 的 专 用 技 术! 多 态 即 多 种 形 态 : 对 象 只 能 由 一 种 形 态, 但 变 量 是 多 态 的 Employee empobject = new Employee(); empobject.department = "Sale"; 在 父 中 包 含 一 些 从 不 会 用 到 的 方 法 目 的 是 为 了 实 现 多 态 方 便 参 数 的 多 态 性 参 数 的 多 态 性 方 法 重 载 方 法 重 载 (overloading) 即 指 多 个 方 法 可 以 享 有 相 同 的 名 字 但 是 这 些 方 法 的 参 数 必 须 不 同, 或 者 是 参 数 个 数 不 同, 或 者 是 参 数 型 不 同 举 例 : 要 打 印 不 同 型 的 数 据,int, float, String, 不 需 要 定 义 不 同 名 的 方 法 : printint(int); printfloat(float); printstring(string) 利 用 方 法 重 载, 只 需 定 义 一 个 方 法 :
println(): v println(int); v println(float); v println(string); 多 态 的 另 一 个 解 决 方 案 是 接 口 接 口 提 供 用 户 一 种 请 求 对 象 方 法 的 途 径 L6.4 应 用 约 束 信 息 隐 藏 Java 中 的 方 法 和 变 量 的 修 饰 符 的 严 格 定 义 及 修 饰 字 (SB6.18) [ 的 修 饰 字 ] class 名 称 [extends 父 名 称 ] {... } 方 法 和 变 量 的 定 义 及 修 饰 字 [ 变 量 修 饰 字 ] 变 量 数 据 型 变 量 名 1, 变 量 名 2[= 变 量 初 值 ] ; [ 方 法 修 饰 字 ] 方 法 的 返 回 值 型 方 法 名 称 ( 参 数 1, 参 数 2, ) { // 方 法 的 内 容 } 的 名 空 间 及 访 问 规 则 每 个 都 创 造 了 有 自 己 的 名 字 空 间, 指 方 法 和 变 量 可 以 知 道 彼 此 的 存 在, 可 以 使 用 abstract 不 能 直 接 产 生 属 于 这 个 的 对 象 final 不 能 被 其 他 任 何 所 继 承 ( 安 全 的 考 虑 ) public 不 但 可 以 被 同 一 程 序 包 中 的 其 它 使 用, 别 的 程 序 包 中 的 也 可 以 使 用. friendly( 缺 省 ) 只 能 被 本 包 中 的 其 它 使 用 L6.4 应 用 约 束 变 量 和 方 法 名 空 间 及 访 问 规 则 变 量 和 方 法 的 修 饰 字 Public Protected private Protected 如 果 一 个 中 变 量 或 方 法 有 修 饰 字 protected, 同 一 同 一 包 可 以 使 用 不 同 包 的 要 使 用, 必 须 是 该 的 子 可 以 存 取 变 量 或 调 用 private 不 允 许 任 何 其 他 存 取 和 调 用 friendly( 前 边 没 有 修 饰 字 的 情 况 ) 在 同 一 程 序 包 中 出 现 的 才 可 以 直 接 使 用 它 的 数 据 和 方 法. 覆 盖 当 子 中 的 变 量 名 与 父 的 相 同, 原 来 的 变 量 被 遮 盖. 覆 盖 方 法 的 覆 盖 (overriding) 和 重 载 (overloading) 子 孙 中 定 义 的 方 法 和 祖 先 中 某 个 方 法 同 名, 同 参 数 行, 则 祖 先 中 的 该 方 法 被 覆 盖. 方 法 的 重 载 是 指 一 个 对 象 的 多 态 性, 即 多 个 方 法 用 相 同 的 名 称, 但 参 数 行 不 同. static 属 于 的 变 量 和 方 法 ----static static 在 变 量 或 方 法 之 前, 表 明 它 们 是 属 于 的 static 静 态 变 量 静 态 变 量 在 各 实 例 间 共 享 如 果 是 public 静 态 变 量 v 则 其 它 可 以 不 通 过 实 例 化 访 问 它 们 静 态 方 法 静 态 方 法 称 为 的 方 法 v 因 此 不 用 实 例 化 即 可 调 用 ( 面 向 过 程 ) 局 部 变 量 一 个 对 象 的 方 法 可 以 访 问 对 象 的 数 据 成 员, 尽 管 不 属 于 方 法 的 局 部 变 量 一 个 的 方 法 只 能 访 问 自 己 的 局 部
变 量 抽 象 abstract 抽 象 定 义 了 其 它 的 共 同 属 性 和 行 为 (SB6.27) 用 作 基, 派 生 出 同 一 种 的 特 定 v 是 指 不 能 直 接 被 实 例 化 的 v 一 般 作 为 其 它 的 超 ( 与 final 正 好 相 反 ) 定 义 了 派 生 的 公 共 属 性 定 义 了 派 生 的 方 法 v 可 在 该 中 定 义 但 不 在 该 中 提 供 实 现, 由 继 承 提 供 细 节. v 定 义 抽 象 方 法 的 必 须 是 抽 象. abstract 修 饰 符 用 abstract 关 键 字 来 修 饰 一 个 时, 这 个 叫 做 抽 象 v abstract 必 须 被 继 承 v 抽 象 不 能 被 实 例 化 来 修 饰 一 个 方 法 时, 该 方 法 叫 做 抽 象 方 法 v abstract 方 法 必 须 被 覆 盖 v 抽 象 方 法 只 需 声 明, 而 不 需 实 现 final 到 此 为 止 -----final final 在 方 法 之 前, 防 止 该 方 法 被 覆 盖. final 在 之 前, 标 是 该 不 能 被 继 承 final 在 变 量 之 前, 定 义 一 个 常 量. 换 句 话 说 final 修 饰 变 量, 变 量 就 变 成 了 常 量 ; final 修 饰 方 法, 方 法 就 不 能 再 覆 盖 ; final 修 饰, 就 不 能 再 继 承 就 是 方 法 定 义 和 常 量 值 的 集 合 从 本 质 上 讲, 接 口 是 一 种 特 殊 的 抽 象, 这 种 抽 象 中 只 包 含 常 量 和 方 法 的 定 义, 而 没 有 变 量 和 方 法 的 实 现 不 相 关 的 可 以 实 现 (implement) 同 一 个 接 口 同 一 个 可 以 实 现 多 个 不 相 关 的 接 口 接 口 的 使 用 用 implements 子 句 来 表 示 一 个 使 用 某 个 接 口 在 体 中 可 以 使 用 接 口 中 定 义 的 常 量, 而 且 必 须 实 现 接 口 中 定 义 的 所 有 方 法 一 个 可 以 实 现 多 个 接 口, 在 implements 子 句 中 用 逗 号 分 隔 接 口 的 使 用 利 用 接 口 可 实 现 多 重 继 承 ( 可 同 时 实 现 多 个 接 口 ) 接 口 的 作 用 和 抽 象 似, 指 定 原 型, 不 直 接 定 义 方 法 的 内 容. 接 口 案 例 通 过 接 口 可 以 实 现 不 相 关 的 相 同 行 为 v 而 不 需 要 考 虑 这 些 之 间 的 层 次 关 系 可 以 指 明 多 个 需 要 实 现 的 方 法 可 以 了 解 对 象 的 交 互 界 面 v 而 不 需 了 解 对 象 所 对 应 的 L6. 练 习 6.D.3 6.P.3 6.34 独 立 实 践 Cycle3 第 六 课 总 结 1. 的 复 用 2. 的 继 承 3. 关 于 多 态 4. 应 用 约 束 ( 封 装 ) 5. 接 口 问 题
再 见