Java 语 言 的 面 向 对 象 特 性

北 航 计 算 机 系----陈 冲----黎 杰


---- Java 语 言 是Sun 公 司1995 年 推 出 的 新 型 面 向 对 象 程 序 设 计 语 言(OOPL,Object Oriented Programming Language)。 它 以C + + 为 蓝 本, 保 留 了C + + 的 许 多 面 向 对 象 特 性, 并 改 进 了 一 些 机 制, 如 封 装 主 函 数、 串 和 数 组 对 象 化 等, 摒 弃 了 可 能 引 起 二 义 性、 冗 余 和 存 在 不 安 全 隐 患 的 语 言 机 制, 如 运 算 符 重 载、 多 重 继 承 以 及 类 型 自 动 转 换 等, 使 其 面 向 对 象 特 性 比C + + 更 突 出。 此 外, 为 满 足 网 络 计 算 的 需 要,Java 又 增 加 了 分 布 式、 动 态 性、 并 行 性、 可 移 植 性 等 特 性, 取 消 了C + + 中 指 针、 指 针 运 算 等 不 利 于 分 布 式 计 算 的 机 制, 为 在 分 布 式 环 境 下 开 发 动 态 可 扩 展 的 应 用 提 供 了 便 利 条 件。

对 面 向 对 象 计 算 模 型 的 支 持

---- 一 般 认 为 面 向 对 象 有 五 大 特 征: 抽 象、 封 装、 继 承、 多 态 和 动 态 束 定。 一 种OOPL 至 少 应 支 持 这 些 特 征, 下 面 依 次 分 析Java 语 言 对 以 上 五 点 的 支 持。

---- 1.抽 象 和 封 装

---- 客 观 世 界 中 的 对 象 均 具 有 属 性 和 行 为, 映 射 到 程 序 世 界 中, 属 性 表 示 数 据, 行 为 代 表 操 作。 所 谓 封 装, 就 是 用 一 个 自 主 式 框 架 将 数 据 集 和 操 作 集 组 织 在 一 起, 构 成 一 个 程 序 实 体, 即 程 序 世 界 中 的 对 象。 在 面 向 对 象 概 念 中, 对 象 是 支 持 封 装 的 手 段, 是 封 装 的 基 本 单 位。 数 据 集 描 述 对 象 的 状 态, 对 象 行 为( 执 行 操 作) 的 结 果 引 起 状 态 改 变。 对 象 内 部 的 数 据 和 操 作 可 以 公 有(public) 也 可 以 私 有(private)。 私 有 的 数 据 和 操 作 只 能 被 对 象 自 身 访 问, 公 有 的 操 作 和 数 据 则 可 被 其 他 对 象 访 问。 每 个 对 象 可 以 接 收 一 组 消 息, 对 象 解 释 一 条 消 息, 执 行 一 个 相 应 的 操 作。 一 个 面 向 对 象 程 序 的 执 行 就 是 系 统 中 一 系 列 对 象 之 间 相 互 发 消 息 通 信 的 过 程。 因 此, 面 向 对 象 的 程 序 设 计 模 型 可 以 概 括 为: 程 序= 对 象 + 消 息。

---- 封 装 和 抽 象 是 密 不 可 分 的。 在Java 语 言 中, 对 象 由 类(class) 来 描 述, 每 个 对 象 均 有 一 个 相 应 的 类。 类 是 具 有 相 似 特 征 的 对 象 模 板, 是 对 具 体 对 象 的 抽 象。 对 象 通 过 实 例 化 一 个 类 而 得 以 创 建, 被 创 建 的 对 象 称 为 类 的 一 个 实 例(Instance)。 类 中 封 装 了 对 象 的 属 性 和 方 法, 对 象 的 属 性 既 可 以 是 常 量 也 可 以 是 其 他 类 的 实 例, 对 象 的 方 法 用 函 数 和 过 程 来 表 示。

---- 与C + + 不 同,Java 更 纯 正, 即 语 言 的 任 何 方 面 都 是 基 于 消 息 或 基 于 对 象 的, 所 有 数 据 类 型, 无 论 简 单 还 是 复 杂, 均 为 对 象 类。 可 以 从 三 个 方 面 来 说 明Java 的 纯 面 向 对 象 特 性: 首 先,Java 实 现 了ANSI C 中 所 有 数 据 类 型, 并 且 为 这 些 基 本 数 据 类 型 定 义 了 对 象 类, 如 整 型int 的 类 为Integer。 其 次, 在Java 语 言 中 字 符 串 和 数 组 也 是 对 象, 它 们 分 别 用 字 串 类(String) 和 相 应 类 的 数 组 类 来 描 述, 例 如, 如 果 你 定 义 了A 类, 则Java 自 动 为 你 定 义A 的 数 组 类A[]。 最 后, 同Smalltalk 类 似,Java 语 言 中 的 类 也 是 对 象, 类 可 以 用 元 类 来 描 述。 元 类 是Java 内 定 义 的 一 种 特 殊 类, 是 对 类 的 抽 象, 它 可 以 用 来 实 现Java 的 动 态 特 性 — — 即 时 装 入 类, 生 成 实 例。

---- 此 外,Java 语 言 可 以 通 过 前 置 修 饰 符 来 标 明 对 象 属 性 和 方 法 的 可 访 问 程 度。 其 中 公 共(public) 属 性 和 方 法 可 以 被 任 何 类 的 实 例 访 问; 友 元(friendly) 属 性 和 方 法 只 能 被 同 一 包(package) 中 类 的 实 例 访 问; 受 保 护(protected) 的 属 性 和 方 法 只 能 由 对 象 本 身 及 其 子 类 的 实 例 访 问; 私 有 属 性 和 方 法 只 能 由 对 象 本 身 访 问。 属 性 和 方 法 的 访 问 修 饰 符 体 现 了 面 向 对 象 中 的 封 装 原 则。

---- 2.继 承 性

---- 面 向 对 象 的 继 承 性 意 味 着 在 开 发 新 类 时 可 以 只 说 明 它 与 另 一 个 已 存 在 的 类 的 不 同 之 处, 新 类 继 承 已 存 在 类 的 属 性 和 方 法。 在 继 承 层 次 中, 父 类 也 叫 基 类, 子 类 也 叫 派 生 类。 一 个 派 生 类 只 有 一 个 基 类 称 为 单 继 承, 若 有 多 个 基 类 则 称 为 多 继 承。 如 果 将 基 类 及 其 派 生 类 组 成 的 类 体 系 存 入 库 中 则 形 成 类 库。 类 库 为 软 件 开 发 带 来 莫 大 方 便, 程 序 设 计 的 主 要 工 作 就 是 浏 览 类 库, 选 择 合 适 的 类 加 以 重 用, 这 样 减 少 了 代 码 重 复, 减 轻 了 开 发 的 工 作 量。

---- 继 承 是Java 语 言 的 核 心 思 想, 它 的 基 本 类 库 作 为 语 言 自 身 的 一 部 分 而 存 在。 在Java 中, 无 论 系 统 类 库 中 已 存 在 的 类 还 是 用 户 定 义 的 新 类 都 直 接 或 间 接 地 继 承 于 一 个 公 共 基 类Object。Objetc 定 义 了 所 有 类 实 例 的 若 干 公 共 的 行 为: 实 例 间 复 制、 比 较 以 及 线 程 操 作 等。

---- Java 语 言 在 类 之 间 通 过extend 关 键 字 实 现 单 继 承, 一 个 类 仅 能 有 一 个 基 类, 因 此Java 的 核 心 继 承 体 系 是 树 状 结 构。 此 外,Java 还 引 入 了 一 种 新 的 语 言 机 制 — — 接 口(Interface)。 在Java 中, 接 口 是 一 种 特 殊 的 抽 象 类, 它 仅 能 声 明 常 量 和 抽 象 方 法, 而 没 有 方 法 的 具 体 实 现。 方 法 的 具 体 实 现 在 实 现(Implements) 接 口 的 类 中 定 义。 一 个 类 除 了 继 承 基 类 外, 还 可 以 实 现 多 个 接 口, 并 且 处 在 不 同 继 承 分 枝 的 类 可 以 实 现 同 一 接 口, 这 样 就 间 接 地 实 现 了 多 重 继 承。

---- 3.多 态 性 和 动 态 束 定

---- 一 个 名 字 代 表 多 种 类 型, 多 种 类 型 的 变 量, 或 多 个 不 同 语 义 的 函 数 或 过 程 叫 多 态。 我 们 经 常 会 遇 到 不 同 类 型 的 对 象 具 有 相 同 行 为, 但 行 为 内 容 不 同 的 情 况, 比 如 汽 车 和 飞 机 都 可 以 运 动, 但 它 们 具 体 运 动 的 方 式 并 不 相 同, 这 就 是 面 向 对 象 中 的 多 态。

---- Java 主 要 在 四 个 方 面 体 现 多 态 性: 继 承、 重 载(overloading)、 覆 盖(overriding) 和 接 口。 在 继 承 机 制 中, 基 类 定 义 的 操 作 适 用 于 类 的 对 象, 这 种 多 态 也 称 为 包 容 多 态, 是 最 简 单 的 多 态 方 法。 象C + + 一 样,Java 语 言 在 同 一 个 类 中 支 持 方 法 重 载, 即 方 法 相 同, 但 参 数 类 型、 个 数 不 同。 例 如, 一 个Java 类 可 以 定 义 多 个 构 造 函 数, 在 实 例 化 中, 根 据 不 同 参 数 调 用 同 名 方 法 的 不 同 实 现 版 本, 重 载 也 是 多 态 的 一 种 类 型。 覆 盖 和 重 载 是 完 全 不 同 的 概 念,Java 的 方 法 重 载 在 同 一 个 类 中, 而 方 法 覆 盖 则 在 有 继 承 关 系 的 不 同 类 中, 即 在 有 继 承 关 系 的 类 之 间 实 现 多 态。 顾 名 思 义, 覆 盖 不 仅 方 法 名 相 同, 且 变 元 数 目 和 类 型, 方 法 返 回 类 型 都 相 同, 即 在 派 生 类 中 重 新 实 现 基 类 的 某 一 方 法。 此 外,Java 语 言 还 可 以 通 过 接 口 在 没 有 直 接 联 系 的 类 之 间 实 现 多 态。 前 面 提 到, 接 口 中 的 方 法 是 抽 象 方 法, 有 声 明 而 没 有 具 体 实 现, 任 何 实 现 接 口 的 类 都 要 具 体 实 现 接 口 的 方 法。 这 样, 多 个 实 现 同 一 接 口 的 类 就 有 了 同 名 的 方 法, 不 同 的 方 法 实 现, 体 现 了 多 态 性。 重 载、 覆 盖 和 接 口 实 现 的 多 态 都 是 同 一 方 法 配 备 的 多 个 方 法 体, 它 们 统 称 为 重 载 多 态。

Java 语 言 的 动 态 特 性

---- 多 数 面 向 对 象 程 序 设 计 语 言 在 系 统 设 计 编 制 阶 段 都 能 充 分 体 现OO 思 想, 但 却 很 难 将OO 延 伸 至 系 统 运 行 和 维 护 阶 段。 这 主 要 是 因 为 多 数 语 言 都 采 用 静 态 链 连 机 制, 即 在 编 译 时 就 将 组 成 系 统 的 各 模 块 和 类 链 连 组 合 成 一 个 整 体, 破 坏 了 系 统 的 模 块 性。 在 系 统 运 行 和 维 护 阶 段, 如 果 某 些 类 进 行 了 修 改 或 升 级, 整 个 系 统 必 须 重 新 编 译 才 能 利 用 类 新 增 或 修 改 的 功 能, 未 能 体 现 面 向 对 象 的 优 势。 此 外, 随 着 网 络 技 术 的 发 展, 计 算 环 境 正 迅 速 由 单 主 机 集 中 式 向 网 络 分 布 式 转 变。 在 分 布 式 环 境 中, 系 统 运 行 情 况 更 为 复 杂, 维 护 越 发 困 难, 特 别 是 在 某 些 情 况 下, 系 统 一 旦 运 行 一 般 就 不 能 停 止, 例 如 金 融 机 构 的 联 机 事 务 处 理 系 统 等。 如 何 在 运 行 中 动 态 的 进 行 系 统 修 改 和 升 级 便 成 为 迫 切 需 要 解 决 的 问 题。

---- Java 语 言 的 动 态 特 性 是 对 面 向 对 象 设 计 的 延 伸, 这 种 特 性 使 得 用Java 开 发 的 系 统 能 够 适 应 不 断 变 化 的 执 行 环 境, 这 正 可 以 解 决 上 述 问 题。 动 态 特 性 的 技 术 核 心 是 滞 后 联 编, 滞 后 联 编 使Java 将OO 特 点 延 伸 到 系 统 运 行 阶 段。 我 们 知 道,Java 程 序 的 基 本 组 成 单 位 是 类, 编 译 时 每 个 类 被 分 别 编 译 成 相 应 的 类 文 件, 这 样 一 个 系 统 由 若 干 个 类 文 件 组 成, 系 统 的 模 块 性 得 以 保 留, 在 系 统 运 行 时, 类 文 件 按 程 序 运 行 需 要 被 动 态 装 载, 即 插 即 用(Plug -And -Play)。 利 用 这 种 特 性, 系 统 的 支 持 类 修 改 之 后, 相 应 的 应 用 程 序 不 必 重 新 编 译, 也 一 样 可 以 利 用 修 改 后 类 的 功 能。 如 果 类 文 件 是 分 布 在 网 络 环 境 下,Java 也 可 以 利 用 这 种 特 性 在 分 布 式 环 境 中 动 态 维 护 应 用 程 序 及 其 支 持 类 库 之 间 的 一 致 性。

小 结

---- Java 语 言 是Sun 公 司 开 发 的 新 型 面 向 对 象 程 序 设 计 语 言。 它 以 简 单 易 学、 概 念 清 晰 的 纯 面 向 对 象 特 性 见 长, 非 常 适 合 于 学 习 面 向 对 象 程 序 设 计。


中国计算机世界出版服务公司版权所有