语 言 程 序 设 计 郑 莉 胡 家 威 编 著 清 华 大 学 逸 夫 图 书 馆 北 京
内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 握 语 言 程 序 设 计 的 相 关 技 术 无 论 作 者 使 用 多 少 技 巧 去 查 找 错 误, 有 些 错 误 还 是 悄 悄 地 隐 藏 了 起 来, 并 且 对 新 读 者 或 多 或 少 都 会 造 成 一 定 的 困 扰 如 果 你 发 现 了 任 何 你 认 为 是 错 误 的 地 方, 请 通 过 电 子 邮 件 联 系 我 们, 对 于 您 的 帮 助 我 们 不 胜 感 激
前 言 随 着 互 联 网 的 发 展, 程 序 设 计 成 为 了 众 多 计 算 机 和 相 关 专 业 本 科 生 不 可 或 缺 的 基 本 技 能, 而 其 中 语 言 在 高 级 编 程 语 言 中 仍 然 是 佼 佼 者 本 书 从 语 言 的 基 础 开 始, 深 入 浅 出 地 讲 解 语 言 的 方 方 面 面, 希 望 读 者 能 够 深 刻 感 受 到 语 言 的 魅 力 以 及 进 行 开 发 的 快 乐 本 书 的 特 色 本 书 有 以 下 几 大 特 色 : 本 书 的 内 容 深 入 浅 出 考 虑 到 读 者 可 能 是 刚 刚 开 始 学 习 编 程 语 言, 所 以 本 书 的 内 容 不 会 讲 解 很 深 奥 的 问 题, 但 是 为 了 保 证 内 容 的 完 整 性, 肯 定 会 对 难 点 有 所 涉 及, 对 于 这 部 分 内 容 我 们 会 给 出 相 应 的 资 料 供 读 者 参 考 本 书 的 习 题 专 业 经 典 为 了 让 读 者 得 到 更 好 地 编 程 锻 炼, 章 节 后 面 的 习 题 我 们 都 是 精 心 挑 选 和 设 计 的, 目 的 是 为 了 让 读 者 对 于 职 场 笔 试 题 有 更 深 入 的 了 解, 并 最 终 做 到 得 心 应 手 本 书 的 案 例 一 气 呵 成 目 前 大 多 数 的 程 序 设 计 教 材 中 都 没 有 太 多 的 案 例, 即 使 有 的 话, 也 只 是 对 应 于 某 个 知 识 点 举 几 个 相 应 的 例 子 而 已 本 书 不 一 样, 本 书 除 了 在 对 应 知 识 点 中 举 写 例 子 让 读 者 更 明 白 如 何 使 用 之 外, 本 书 还 紧 紧 围 绕 着 一 个 精 心 设 计 的 项 目 来 进 行 的
前 言 本 书 写 给 谁 看 本 书 可 作 为 计 算 机 或 者 相 关 专 业 程 序 设 计 课 程 教 材 或 参 考 书, 也 可 作 为 科 技 人 员 使 用 语 言 进 行 开 发 的 参 考 手 册. 源 码 和 文 档 本 书 所 有 的 源 码 和 相 关 文 档 都 会 在 项 目 上 共 享, 地 址 是, 需 要 的 读 者 请 自 行 下 载 使 用. 衷 心 感 谢 首 先 最 需 要 感 谢 的 是 导 师 郑 莉, 感 谢 您 给 了 我 这 次 宝 贵 的 机 会 和 您 一 起 编 写 这 本 教 材, 我 感 到 自 己 很 幸 运, 庆 幸 自 己 能 有 这 样 的 机 会 发 挥 自 己 所 长, 然 后 尽 自 己 的 能 力 完 成 这 本 教 材, 谢 谢 您! 其 次 要 感 谢 我 的 父 母, 不 管 我 走 到 哪 里, 不 管 我 做 什 么, 你 们 永 远 都 支 持 我, 放 手 让 我 去 闯, 放 手 让 我 去 成 长, 谢 谢 你 们 给 了 我 一 辈 子 无 私 奉 献 的 爱, 儿 子 永 远 爱 你 们! 胡 家 威 年 月
目 录 第 一 章 语 言 概 述 语 言 发 展 简 史 语 言 的 特 点 程 序 运 行 机 制 开 发 环 境 搭 建 平 台 的 开 发 环 境 搭 建 平 台 的 开 发 环 境 搭 建 平 台 的 开 发 环 境 搭 建 第 一 个 程 序 : 参 考 文 献
目 录
第 一 章 语 言 概 述 本 章 主 要 内 容 了 解 语 言 的 发 展 过 程 和 它 的 特 点. 了 解 程 序 的 运 行 机 制. 搭 建 开 发 环 境 并 编 写 简 单 程 序. 语 言 发 展 简 史 语 言 历 时 十 多 年 的 发 展, 现 已 成 为 一 门 应 用 最 为 广 泛 的 编 程 语 言 语 言 是 一 门 纯 粹 的 面 向 对 象 的 编 程 语 言, 它 完 美 地 实 现 了 面 向 对 象 的 编 程 理 念, 在 摒 弃 了 中 复 杂 的 概 念 的 同 时, 它 为 开 发 者 提 供 了 完 整 的 开 发 环 境 和 运 行 环 境, 这 样 极 大 地 方 便 了 语 言 的 开 发 时 至 今 日, 大 部 分 的 电 子 商 务 银 行 证 券 等 系 统 都 是 使 用 平 台 架 构 搭 建 的, 规 范 是 目 前 最 为 成 熟 的, 也 是 应 用 最 广 泛 的 企 业 级 应 用 开 发 规 范 乍 一 看 感 觉 语 言 是 专 门 为 了 开 发 的 而 设 计 的 编 程 语 言, 但 实 际 上 这 只 是 个 巧 合 年 月, 公 司 首 席 科 学 家 和 语 言 之 父 等 人 聚 集 在 一 起 讨 论 项 目, 也 就 是 后 来 的 项 目, 该 项 目 是 研 究 计 算 机 在 电 子 消 费 领 域 的 应 用, 它 的 目 标 是 开 发 一 个 智 能 的 电 子 消 费 设 备, 因 为 公 司 预 料 未 来 科 技 将 在 家 用 电 器 领 域 大 显 身 手 经 过 讨 论 之 后, 团 队
第 一 章 语 言 概 述 成 员 开 始 分 工, 的 任 务 是 从 众 多 的 编 程 语 言 中 选 择 一 门 适 合 这 个 项 目 开 发 的 编 程 语 言 一 开 始 选 择 使 用 语 言 进 行 尝 试, 结 果 发 现 对 于 这 个 特 殊 的 项 目 来 说 不 不 够 完 善, 于 是 他 尝 试 对 进 行 了 很 多 的 扩 展 和 修 改, 但 是 后 来 他 放 弃 了 这 种 方 式 为 了 达 到 项 目 的 目 标, 他 自 己 开 发 了 一 门 新 的 语 言 在 英 语 中 是 橡 树 的 意 思, 因 为 他 取 名 字 的 时 候 看 到 办 公 室 窗 户 外 面 正 好 就 有 一 棵 橡 树 后 来 发 现, 这 个 名 字 已 经 被 一 家 显 卡 制 造 商 注 册 了, 所 以 要 想 一 个 新 的 名 字 在 某 一 次 去 当 地 咖 啡 店 喝 咖 啡 的 时 候, 突 然 有 了 灵 感, 想 出 了 这 个 名 字, 因 为 是 印 度 尼 西 亚 爪 哇 岛 的 名 字, 它 因 盛 产 咖 啡 而 出 名 年 年 初, 公 司 发 布 了 语 言, 它 将 源 代 码 都 直 接 放 到 互 联 网 上, 免 费 提 供 给 所 有 人 使 用, 这 让 语 言 瞬 时 间 成 为 了 一 门 广 为 认 知 的 编 程 语 言 年, 公 司 发 布 了 这 个 版 本 包 括 两 个 部 分 : 运 行 环 境, 简 称 和 开 发 环 境, 简 称 运 行 环 境 包 括 虚 拟 机, 简 称 核 心 用 户 界 面 集 成 和 发 布 技 术, 开 发 环 境 包 括 编 译 器 和 一 些 其 他 实 用 的 开 发 工 具 年, 公 司 发 布 了 历 史 上 的 一 个 重 要 版 本 : 该 版 本 将 分 成 了 和 三 个 版 本, 其 中 是 整 个 技 术 的 核 心 和 基 础, 同 时 也 是 其 他 两 个 版 本 的 基 础 ; 是 进 行 企 业 级 应 用 开 发 的 解 决 方 案 ; 是 进 行 移 动 设 备 和 信 息 家 电 等 设 备 开 发 的 解 决 方 案 年, 公 司 发 布 了 万 众 期 待 的, 同 时 将 改 名 为, 改 名 为, 改 名 为 增 加 了 很 多 语 言 特 性, 例 如 泛 型 自 动 拆 箱 和 装 箱 可 变 数 目 的 形 参 等 等 其 次 该 版 本 还 发 布 了 新 的 企 业 级 平 台 开 发 规 范, 并 推 出 了 自 己 的 框 架 规 范 年, 公 司 发 布 了, 也 就 是 一 直 以 来, 公 司 保 持 着 每 两 年 发 布 一 次 新 版 本 的 习 惯 但 是, 年 月, 公 司 收 购 了 公 司, 从 此 江 湖 上 没 有 了 的 身 影 年, 公 司 发 布 了, 这 是 发 布 的 第 一 个 版 本, 里 面 加 入 了 不 少 新 特 性, 本 书 后 面 会 有 详 细 的 介 绍
语 言 的 特 点 拓 展 阅 读 虽 然 公 司 倒 下 了, 但 是 公 司 在 年 推 出 的 基 于 的 开 源 移 动 操 作 系 统 极 大 地 推 动 了 语 言 的 发 展 平 台 使 用 类 的 虚 拟 机, 只 是 它 没 有 遵 守 虚 拟 机 规 范, 其 应 用 开 发 使 用 语 言, 最 终 编 译 成 格 式 的 文 件 由 虚 拟 机 执 行 语 言 的 特 点 语 言 的 特 点 很 多, 正 是 因 为 这 些 特 点 使 得 语 言 在 众 多 的 编 程 语 言 中 脱 颖 而 出, 并 在 编 程 语 言 排 行 榜 中 一 直 处 于 遥 遥 领 先 的 地 位 下 面 简 单 介 绍 语 言 的 几 个 重 要 的 特 点 : 简 单 高 效 : 语 言 的 语 法 和 或 者 语 言 很 接 近, 另 外, 丢 弃 了 中 指 针 多 继 承 等 难 以 理 解 的 内 容, 所 以 比 较 容 易 掌 握 除 此 之 外, 语 言 还 提 供 了 垃 圾 回 收 机 制, 一 方 面 不 需 要 程 序 员 担 心 内 存 管 理, 另 一 方 面 使 得 内 存 得 到 高 效 地 利 用 面 向 对 象 : 语 言 是 一 门 纯 粹 的 面 向 对 象 的 编 程 语 言, 提 供 了 封 装 继 承 和 多 态 的 三 大 特 性, 支 持 类 的 单 继 承 和 接 口 间 的 多 继 承, 并 支 持 类 和 接 口 之 间 的 实 现 机 制, 可 以 说, 是 一 门 优 秀 的 面 向 对 象 的 编 程 语 言 安 全 健 壮 : 语 言 通 常 用 在 网 络 环 境 中, 因 此 提 供 了 很 强 大 的 安 全 机 制 以 防 止 恶 意 代 码 的 进 攻 此 外, 的 异 常 处 理 机 制 强 类 型 机 制 和 自 动 垃 圾 回 收 机 制 等 等 为 程 序 的 健 壮 性 提 供 了 重 要 的 保 障 分 布 式 和 可 移 植 : 语 言 提 供 了 网 络 应 用 编 程 接 口 以 支 持 网 络 应 用 的 开 发, 同 时 提 供 了 远 程 方 法 调 用 机 制 以 支 持 分 布 式 应 用 开 发 程 序 是 可 移 植 的, 因 为 的 体 系 结 构 是 中 立 的, 程 序 在 平 台 上 被 编 译 成 平 台 无 关 的 字 节 码 格 式, 然 后 可 以 在 实 现 这 个 平 台 的 任 何 系 统 中 运 行 系 统 本 身 也 具 有 很 强 的 可 移 植 性, 编 译 器 是 实 现 的, 而 是 用 实 现 的
第 一 章 语 言 概 述 高 性 能 和 多 线 程 : 新 增 加 了 编 译 器, 传 统 的 编 译 器 是 编 译 一 条 指 令, 等 运 行 完 了 之 后 就 扔 掉, 而 会 将 经 常 用 到 的 指 令 保 存 在 内 存 中, 当 下 次 调 用 的 时 候 就 不 用 重 新 编 译 了 随 着 编 译 技 术 的 发 展, 程 序 的 性 能 越 来 越 高 了 另 外, 语 言 支 持 多 个 线 程 同 时 执 行, 并 提 供 多 个 线 程 之 间 的 同 步 和 通 信 机 制 程 序 运 行 机 制 如 果 按 照 程 序 的 执 行 方 式 划 分, 高 级 编 程 语 言 可 以 分 为 编 译 型 语 言 和 解 释 型 语 言 编 译 型 语 言 是 使 用 专 门 的 编 译 器, 针 对 特 定 的 平 台 将 源 代 码 编 译 成 该 平 台 可 以 执 行 的 机 器 码 它 的 运 行 效 率 高, 但 是 跨 平 台 性 差 解 释 型 语 言 是 使 用 专 门 的 解 释 器, 逐 行 将 源 代 码 解 释 成 特 定 平 台 的 的 机 器 码, 并 立 即 执 行 的 语 言 它 运 行 效 率 较 低, 而 且 不 能 脱 离 解 释 器 独 立 执 行, 优 点 是 跨 平 台 性 好, 只 需 要 提 供 特 定 平 台 的 解 释 器 即 可 严 格 来 讲, 语 言 既 不 属 于 编 译 型 语 言, 也 不 属 于 解 释 型 语 言 语 言 比 较 特 殊, 程 序 首 先 是 要 经 过 编 译 器 编 译, 但 是 编 译 出 来 的 结 果 并 不 是 生 成 特 定 平 台 的 机 器 码, 而 是 生 成 一 种 与 平 台 无 关 的 字 节 码, 并 且 这 个 字 节 码 需 要 解 释 器 来 解 释 执 行 编 译 器 编 译 源 程 序 的 时 候, 生 成 的 是 与 平 台 无 关 的 字 节 码, 这 些 字 节 码 不 是 针 对 特 定 平 台 的, 而 是 针 对 虚 拟 机 的 为 了 实 现 程 序 的 平 台 无 关 性, 公 司 制 定 了 虚 拟 机 的 统 一 标 准, 内 容 包 括 指 令 集 寄 存 器 类 文 件 格 式 栈 垃 圾 回 收 堆 和 存 储 区 等 不 同 平 台 上 的 是 不 同 的, 但 是 它 们 提 供 了 相 同 的 接 口 负 责 解 释 执 行 字 节 码, 在 某 些 实 现 中, 虚 拟 机 代 码 能 够 转 换 成 特 定 系 统 的 机 器 码 执 行, 从 而 提 高 执 行 效 率 提 问 环 节 你 现 在 知 道 为 什 么 语 言 既 不 属 于 编 译 型 语 言, 也 不 属 于 解 释 型 语 言 吗?
开 发 环 境 搭 建 开 发 环 境 搭 建 在 进 行 程 序 开 发 之 前 需 要 在 计 算 机 上 安 装 和 配 置 开 发 环 境 的 不 同 系 统 平 台 环 境 配 置 方 式 略 有 差 异, 下 面 分 别 介 绍 三 个 主 流 系 统 下 的 环 境 配 置 方 式 平 台 的 开 发 环 境 搭 建 系 统 下 搭 建 开 发 环 境 较 为 复 杂, 请 参 考 下 面 的 步 骤 进 行 : 登 录 官 方 下 载 网 址 下 载 对 应 于 自 己 计 算 机 平 台 的 最 新 版 本 的, 笔 者 写 作 时 的 最 新 版 本 是 运 行 下 载 的 文 件, 选 择 安 装 全 部 的 组 件, 路 径 可 以 使 用 默 认 的 路 径 C:\Program Files\Java, 但 是 建 议 修 改 为 不 包 含 空 格 的 路 径, 例 如 C:\Java\jdk7 安 装 完 之 后, 会 提 示 继 续 安 装, 建 议 将 和 安 装 在 同 一 个 目 录 下, 例 如 可 以 设 置 安 装 路 径 为 C:\Java\jre7 配 置 环 境 变 量 右 击 我 的 电 脑 图 标, 选 择 属 性, 在 系 统 属 性 窗 口 中 选 择 高 级 选 项 卡, 然 后 选 择 环 境 变 量, 在 环 境 变 量 窗 口 中 选 中 名 称 为 的 系 统 变 量, 点 击 编 辑, 在 该 环 境 变 量 值 末 尾 添 加 ;C:\Java\jdk7\bin, 注 意 前 面 的, 同 时 读 者 需 要 将 路 径 修 改 为 自 己 设 置 的 安 装 路 径 下 的 目 录 打 开 系 统 的 命 令 提 示 符, 执 行 java -version 命 令, 如 果 输 出 了 刚 刚 安 装 的 版 本 号 的 话, 证 明 开 发 环 境 没 有 问 题 了 平 台 的 开 发 环 境 搭 建 系 统 下 搭 建 开 发 环 境 与 系 统 下 的 操 作 类 似, 具 体 步 骤 如 下 : 登 录 官 方 下 载 网 址 下 载 对 应 于 自 己 计 算 机 平 台 的 最 新 版 本 的, 注 意 选 择 扩 展 名 为.tar.gz 格 式 的 压 缩 文 件, 笔 者 写 作 时 的 最 新 版 本 是
第 一 章 语 言 概 述 将 下 载 得 到 的 压 缩 文 件 解 压 到 某 个 目 录 下, 为 了 以 后 的 方 便, 建 议 放 置 在 用 户 主 目 录 下, 例 如 解 压 到 /home/[yourname]/jdk1.7 目 录 打 开 终 端, 以 管 理 员 权 限 在 文 件 /etc/profile 末 尾 添 加 下 面 两 行, 保 存 之 后 注 销 当 前 账 户 重 新 进 入 系 统 执 行 java -version 命 令, 如 果 输 出 了 刚 刚 安 装 的 版 本 号 的 话, 证 明 开 发 环 境 没 有 问 题 了 平 台 的 开 发 环 境 搭 建 系 统 已 经 内 置 了 开 发 环 境, 所 以 可 以 不 用 配 置, 但 是 版 本 可 能 不 是 最 新 的 打 开 终 端, 执 行 java -version 可 以 看 到 当 前 内 置 的 的 版 本, 一 般 是 JDK 1.6.x_yz 对 于 一 般 的 程 序 开 发, 使 用 就 已 经 足 够 了, 如 果 想 体 验 以 上 的 新 特 性, 可 以 考 虑 自 行 安 装 最 新 版 本 的, 本 书 不 再 介 绍
第 一 个 程 序 : 第 一 个 程 序 : 下 面 我 们 来 编 写 第 一 个 程 序, 它 的 目 标 很 简 单, 就 是 在 控 制 台 输 出 Hello Java!, 以 表 达 我 们 对 语 言 世 界 的 问 候 读 者 可 以 在 自 己 计 算 机 中 任 意 打 开 一 个 文 本 编 辑 器, 例 如 下 的 记 事 本 下 的 文 本 编 辑 器, 或 是 下 的, 然 后 在 文 件 中 输 入 下 面 的 代 码, 最 后 将 文 件 保 存 为 HelloWorld.java, 保 存 路 径 最 好 是 一 个 既 不 包 含 中 文 也 不 包 含 空 格 的 路 径 下, 为 了 方 便 以 后 的 代 码 管 理, 建 议 读 者 建 立 一 个 工 作 目 录 专 门 用 来 保 存 编 写 的 代 码, 系 统 可 以 保 存 在 盘 根 目 录 的 某 个 文 件 夹 下, 例 如 C:\JavaCode, 而 或 者 系 统 可 以 保 存 在 用 户 主 目 录 的 某 个 文 件 夹 下, 例 如 /home/[yourname]/javacode 然 后 打 开 终 端, 切 换 到 HelloJava.java 文 件 保 存 的 目 录 下, 输 入 命 令 javac HelloJava.java, 就 是 编 译 器, 参 数 HelloJava.java 就 是 要 进 行 编 译 的 文 件 成 功 执 行 后, 当 前 目 录 下 会 出 现 一 个 HelloJava.class 的 新 文 件, 它 就 是 由 编 译 器 生 成 的 字 节 码 文 件 接 下 来 我 们 使 用 解 释 器 进 行 解 释 执 行, 输 入 命 令 java HelloJava, 注 意 末 尾 不 需 要 加 上.class 即 可 看 到 控 制 台 输 出 了 字 符 串 Hello Java! 下 面 简 单 解 释 下 源 程 序 : 第 一 行 public class HelloJava 声 明 了 一 个 类, 类 的 名 称 是 HelloJava, public 是 类 的 访 问 修 饰 符, 以 后 会 详 细 介 绍 在 语 法 中, 源 文 件 的 扩 展 名 一 定 是.java, 其 次 文 件 名 必 须 和 文 件 中 定 义 为 public 的 类 的 名 称 相 同, 这 里 都 是 HelloJava 接 下 来, 第
第 一 章 语 言 概 述 三 行 public static void main(string[] args) 声 明 了 一 个 方 法, 方 法 名 称 为 main, 只 接 收 一 个 字 符 串 数 组 作 为 参 数, 这 里 的 public 是 对 方 法 的 访 问 修 饰 符, 而 static 表 明 这 是 一 个 静 态 方 法, 以 后 都 会 详 细 介 绍 在 语 法 中, 变 量 和 方 法 是 不 能 够 独 立 存 在 的, 它 们 只 能 存 在 于 某 个 类 中 一 般 而 言, 一 个 程 序 只 有 一 个 主 入 口, 这 里 主 入 口 就 是 方 法, 它 的 方 法 声 明 是 固 定 不 变 的, 其 中 的 参 数 通 常 是 由 控 制 台 传 递 过 来 的 在 方 法 体 中, 使 用 System.out.println 方 法 在 系 统 默 认 的 控 制 台 输 出 中 打 印 Hello Java! 字 符 串, 看 到 的 效 果 如 下 :
参 考 文 献 李 刚 疯 狂 讲 义 电 子 工 业 出 版 社