Java 软 件 设 计 基 础 1. Java 概 述
课 程 参 考 书 目 Java 程 序 设 计 及 应 用 开 发 教 程, 虞 益 诚 主 编, 科 学 出 版 社 Java 教 程,Sharon Zakhour, 人 民 邮 电 出 版 社 Introduction to Java Programming,Y.Daniel Liang, 机 械 工 业 出 版 社 Java 编 程 思 想, Bruce Eckel, 机 械 工 业 出 版 社 课 程 安 排 平 时 成 绩, 形 式 为 上 机 作 业 ; 考 试 成 绩, 考 试 形 式 为 闭 卷 笔 试 其 他 信 息 Email: renkx@ustc.edu.cn Homepage: http://lab508.ustc.edu.cn/java/index.html
1.1 Java 发 展 与 特 点 计 算 机 程 序 设 计 语 言 的 发 展 与 分 类 机 器 语 言 不 需 要 翻 译 即 由 计 算 机 直 接 执 行 的 指 令 叫 做 机 器 指 令 这 些 指 令 的 集 合 叫 做 机 器 语 言 汇 编 语 言 是 一 种 面 向 机 器 的 程 序 设 计 语 言, 它 用 符 号 表 示 机 器 指 令 高 级 语 言 其 语 法 和 结 构 更 类 似 普 通 英 文, 且 由 于 远 离 对 硬 件 的 直 接 操 作, 易 于 掌 握 面 向 对 象 程 序 设 计 面 向 对 象 程 序 设 计 语 言 可 以 直 观 的 反 映 客 观 世 界 的 真 实 表 象, 使 软 件 开 发 人 员 可 运 用 人 类 认 识 事 物 所 采 用 的 一 般 思 维 方 式 来 进 行 软 件 开 发, 与 自 然 语 言 差 距 最 小, 是 当 今 软 件 开 发 与 应 用 的 主 流 技 术
Java 起 源 与 发 展 1991 年 由 美 国 Sun 公 司 开 发 的 具 有 平 台 无 关 性 的 语 言 Oak 1992 年 10 月 更 名 为 Java Java 和 Internet 迅 速 融 合 并 互 相 推 动 快 速 发 展,Java 语 言 已 由 最 初 的 版 本 发 展 到 今 天 的 1.6 Java 的 技 术 现 状 JDK 与 J2SE JDK 是 Sun 公 司 发 布 的 Java 最 初 版 本, 自 从 Java 1.2 发 布 后, 相 应 的 JDK 改 名 为 J2SE 主 要 目 的 是 为 台 式 机 和 工 作 站 提 供 一 个 开 发 和 运 行 的 平 台 J2ME J2EE 主 要 面 向 消 费 电 子 产 品, 例 如 掌 上 电 脑 手 机 等 用 于 开 发 分 布 式 的 企 业 级 大 型 程 序
1.2 Java 运 作 机 制 语 言 翻 译 的 一 般 过 程 语 言 翻 译 程 序 的 作 用 示 意 图
Java 平 台 是 一 种 运 行 在 其 他 基 于 硬 件 平 台 之 上 的 纯 软 件 平 台 Java 应 用 程 序 编 程 接 口 (API:Application Programming Interface) Java 虚 拟 机 (JVM:Java Virtual Machine) JVM 可 以 在 任 何 处 理 器 上 安 全 兼 容 地 执 行 Java 应 用 程 序 JVM 可 建 立 于 不 同 的 硬 件 系 统 不 同 的 操 作 系 统 平 台 Java 程 序 被 翻 译 为 与 机 器 无 关 的 字 节 码 文 件 (*.class 文 件 ), 再 由 JVM 转 换 成 某 种 处 理 器 的 专 用 代 码, 因 此 可 以 达 到 一 次 编 写, 处 处 运 行 的 理 想
Java 虚 拟 机 JVM 的 执 行 过 程 加 载 代 码 校 验 代 码 代 码 执 行
1.3 Java 程 序 的 分 类 Java Application 用 来 开 发 命 令 行 程 序 窗 体 程 序 服 务 器 端 程 序 等 Java Applet 是 一 种 嵌 入 到 Web 页 面 的 网 络 应 用 程 序, 由 浏 览 器 内 部 的 Java 解 释 器 来 解 释 运 行 Java Servlet JSP 运 行 于 Web 服 务 器 端 的 Java 程 序, 可 以 与 客 户 端 的 Applet 或 者 HTML 页 面 进 行 交 互 用 于 生 成 动 态 网 页, 基 于 Servlet 技 术, 在 HTML 文 件 中 加 入 Java 程 序 片 段 (Scriptlet) 和 JSP 标 记 可 实 现 程 序 与 页 面 格 式 控 制 的 分 离
1.4 Java 运 行 平 台 Java 技 术 既 是 一 种 编 程 语 言, 也 是 一 个 平 台 Java 运 行 时 环 境 (JRE:Java Runtime Environment) 许 多 主 要 的 浏 览 器 都 提 供 的 Java 解 释 器 和 运 行 时 的 环 境 其 他 工 具, 如 文 档 生 成 器 文 件 打 包 工 具 等 Java 语 言 规 范 和 Java API 定 义 Java 的 标 准 Java 语 言 规 范 是 一 种 语 言 的 技 术 定 义, 包 括 语 法 和 语 义 完 整 的 Java 语 言 规 范 可 在 http://java.sun.com/docs/jls 上 找 到 Java API 包 括 用 于 开 发 Java 程 序 准 备 的 类 和 接 口
JDK 系 统 的 安 装 获 取 与 安 装 http://java.sun.com/javase/downloads.jsp 运 行 jdk-6u7-windows-i586-p.exe 安 装 系 统 路 径 与 主 要 文 件 Java 编 译 器 :javac.exe 用 于 将 Java 源 代 码 文 件 (*.java) 编 译 成 能 被 Java 解 释 器 运 行 的 类 字 节 码 文 件 (*.class) Java 字 节 码 解 释 器, 即 JVM:java.exe 用 于 Java 程 序 的 解 释 执 行, 直 接 从 类 字 节 码 文 件 执 行 Java 应 用 程 序 Java Applet 浏 览 器 :appletviewer.exe 是 一 种 执 行 嵌 入 HTML 文 件 上 Java Applet 的 Java 浏 览 器 JDK 由 开 发 和 测 试 Java 程 序 的 独 立 程 序 组 成, 从 命 令 行 调 用
JDK 环 境 变 量 设 置 Path 设 置 Java 编 译 器 解 释 器 等 位 于 Java 安 装 目 录 的 bin 文 件 夹 中, 为 了 能 在 任 何 目 录 中 使 用 以 上 工 具, 应 在 系 统 特 性 中 设 置 Path ClassPath 设 置 该 设 置 指 明 Java 虚 拟 机 要 装 载 类 的 路 径 为 了 使 编 译 程 序 能 够 找 到 用 户 定 义 的 类 和 系 统 类 所 在 的 包, 需 要 将 用 户 类 所 在 的 目 录 和 系 统 类 所 在 的 包 放 入 到 ClassPath 变 量 中
1.5 Java 程 序 开 发 Java 程 序 开 发 步 骤 编 辑 源 程 序 :*.java 编 译 源 程 序 得 到 字 节 码 文 件 :*.class 运 行 程 序 传 统 语 言 的 运 行 机 制 Java Application 为 解 释 运 行 Java 语 言 的 运 行 机 制 Java Applet 需 通 过 浏 览 器 加 载 运 行
Java Application 的 开 发 编 写 Java 源 程 序 编 译 和 运 行 Java 源 程 序 使 用 javac.exe 来 编 译,java.exe 来 运 行
程 序 解 析 Java 语 言 严 格 区 分 大 小 写 源 文 件 的 命 名 规 则 类 名 方 法 名 包 名 接 口 名 变 量 名 常 量 名
定 义 类 类 定 义 最 基 本 的 形 式 是 : 大 括 号 括 起 的 内 容 就 是 类 体, 即 类 的 属 性 和 方 法 main 方 法 一 个 应 用 程 序 必 须 有 且 只 有 一 个 main 方 法, 它 是 应 用 程 序 的 入 口 点 main 方 法 接 受 单 一 参 数 :String 类 型 的 元 素 的 数 组, 该 数 组 是 一 种 机 制, 运 行 时 系 统 通 过 它 把 消 息 传 递 给 应 用 程 序 数 组 中 的 每 个 字 符 串 称 为 命 令 行 参 数 (command-line argument)
Java Applet 开 发 编 写 Applet 源 程 序
编 写 相 应 的 HTML 文 件 编 译 Applet 源 程 序 使 用 javac.exe 来 编 译 运 行 Applet 小 应 用 程 序 使 用 appletviewer 在 浏 览 器 中 直 接 打 开
1.6 Java 开 发 工 具 简 介 Java 开 发 工 具 是 为 快 速 开 发 Java 程 序 提 供 集 成 开 发 环 境 (IDE) 的 软 件 Borland 公 司 JBuilder IBM 公 司 Eclipse Visual Age for Java Sun 公 司 NetBeans Java WorkShop JCreator Sun Java Studio Symantec 公 司 Visual Café for Java Oracle 公 司 JDeveloper JetBrains 公 司 IntelliJ IDEA EBA 公 司 WebLogic Workshop
1.7 JCreator 代 码 视 图 文 件 视 图 类. 包. 属 性 视 图 编 译 视 图 输 出 视 图
附 录 Java 的 技 术 现 状 * Java 语 言 的 特 点 * JVM 执 行 过 程 的 特 点 * Java 平 台 提 供 特 性 * Java 与 C/C++ 的 比 较 *
Java 的 技 术 现 状 * J2EE/J2SE/J2ME 的 应 用 领 域 Optional Packages J2ME Java 2 Enterprise Edition (J2EE) Optional Packages Java 2 Standard Edition (J2SE) Personal Profiles CDC RMI Foundation Profile MID Profile CLDC Java Card APIs Java Virtual Machine CVM KVM Card VM
Optional Packages 一 个 或 多 个 APIs( 应 用 程 序 编 程 接 口 ) 的 集 合, 在 Java 平 台 上, 它 们 是 可 用 的, 并 且 可 能 在 兼 容 平 台 上 也 被 支 持 随 着 时 间 推 移, Optional Packages 可 能 因 为 市 场 需 要 而 变 成 必 需 的 CDC:Connected Device Configuration 对 应 于 那 些 有 电 源 的, 电 力 充 裕, 较 大 的 设 备 例 如 : 电 视 机, 冰 箱 等 CVM (C Virtual Machine),KVM(K Virtual Machine) KVM 和 CVM 均 可 被 看 作 是 一 种 Java 虚 拟 机, 是 JVM 的 子 集, 在 功 能 上 都 是 JVM 的 缩 减 版 这 两 类 虚 拟 机 的 适 用 范 围 并 不 相 同, 简 单 地 说, CVM 的 功 能 比 KVM 功 能 更 为 强 大 KVM 是 sun 专 门 为 使 用 16/32 位 RISC/CISC 微 处 理 器 或 控 制 器, 并 其 可 用 内 存 为 160kb~512kb 的 的 设 备 而 开 发 的
CLDC: Connected, Limited Device Configuration 对 应 于 主 要 使 用 电 池, 小 型 的 设 备, 例 如 : 手 机,pda 等 MID(Mobile Information Device) Profile 移 动 信 息 设 备 简 表, 定 义 了 移 动 信 息 设 备 的 类 型 和 提 供 相 关 的 API 集 合, MIDP 所 定 义 的 功 能 更 加 面 向 用 户, 而 且 比 CLDC 更 高 级 Foundation Profile( 基 础 简 表 ) 提 供 除 了 用 户 界 面 以 外 J2SE 所 能 够 提 供 的 标 准 类 库 RMI(Remote Method Invocation) 远 程 方 法 调 用 Java 卡 是 Java 平 台 中 最 小 的 子 集, 也 是 一 种 特 殊 的 智 能 卡, 智 能 卡 是 一 种 嵌 入 计 算 机 芯 片 的 卡 片
Java 语 言 的 特 点 * 面 向 对 象 性 面 向 对 象 其 实 是 现 实 世 界 模 型 的 自 然 延 伸 现 实 世 界 中 任 何 实 体 都 可 以 看 成 是 对 象, 对 象 之 间 通 过 消 息 相 互 作 用 传 统 的 面 向 过 程 编 程 语 言 : 中 心 是 过 程, 驱 动 是 算 法 面 向 对 象 的 编 程 语 言 : 中 心 是 对 象, 驱 动 是 消 息 简 单 便 捷 性 系 统 精 简, 入 门 迅 速, 编 写 的 代 码 更 少 平 台 无 关 性 平 台 (Platform) 是 程 序 在 其 中 运 行 的 硬 件 或 软 件 环 境, 大 多 数 平 台 可 以 被 描 述 为 操 作 系 统 和 底 层 硬 件 的 组 合 计 算 机 只 能 识 别 运 行 本 身 的 机 器 语 言 (0,1 构 成 的 指 令 系 统 ) 因 此 程 序 设 计 语 言 程 序 需 要 通 过 语 言 翻 译 程 序 将 其 映 射 成 等 价 的 机 器 码, 这 与 平 台 环 境 紧 密 相 关
语 言 健 壮 性 Java 是 一 种 强 制 类 型 语 言, 在 编 译 运 行 时 对 程 序 进 行 严 格 的 检 查, 以 防 止 不 匹 配 问 题 的 发 生 ; 同 时 自 动 垃 圾 回 收 功 能 有 助 于 避 免 内 存 泄 露, 增 加 了 Java 的 健 壮 性 运 作 安 全 性 Java 语 言 在 运 行 程 序 时 严 格 检 查 数 据 的 访 问 权 限, 不 允 许 网 络 上 的 应 用 程 序 修 改 本 地 数 据 ; 下 载 到 用 户 端 的 字 节 码 只 有 被 核 实 后 才 能 由 Java 解 释 器 执 行, 而 执 行 过 程 中 还 要 通 过 阻 止 对 内 存 的 直 接 访 问 来 提 高 安 全 性 ; Java 提 供 加 密 技 术 与 多 种 安 全 网 络 协 议 系 统 移 植 性 Java 的 平 台 无 关 性 是 该 类 应 用 程 序 可 方 便 的 移 植 到 其 他 计 算 机 上 运 行 的 基 础 ;
Java 的 编 译 器 由 Java 语 言 实 现, 解 释 器 由 Java 语 言 和 标 准 C 实 现, 使 得 Java 语 言 系 统 自 身 就 具 备 了 可 移 植 性 动 态 扩 展 性 可 以 在 本 地 或 网 上 动 态 的 加 载 各 种 类 库, 在 执 行 过 程 中 可 以 随 意 的 增 加 新 方 法 实 例 变 量 等, 运 行 中 的 程 序 只 有 在 需 要 时 才 会 加 载 相 应 的 模 块, 便 于 扩 展 程 序 高 性 能 Java 字 节 码 技 术 可 快 速 的 将 编 辑 的 Java 语 言 转 换 成 高 性 能 的 机 器 码 来 执 行 ; 相 应 的 自 动 寄 存 器 分 配 与 编 译 器 对 字 节 码 的 一 些 优 化 技 术 可 以 生 成 高 质 量 的 代 码 ; JVM 的 改 进 和 即 时 编 译 (Just in Time) 技 术 的 出 现 使 得 Java 的 执 行 速 度 有 了 更 大 的 提 高
多 线 程 机 制 线 程 又 被 称 为 轻 量 进 程, 是 比 传 统 进 程 更 小 的 并 且 可 以 并 发 执 行 的 单 位 多 个 线 程 可 以 共 用 一 个 内 存 区 域, 共 享 同 一 组 系 统 资 源, 其 间 通 信 和 切 换 的 系 统 开 销 要 远 远 小 于 进 程 Java 环 境 本 身 就 是 多 线 程 的, 若 干 个 线 程 运 行, 负 责 必 要 的 无 用 单 元 回 收 系 统 维 护 等 系 统 级 操 作 ; Java 提 供 了 一 个 Thread 类 和 一 组 内 置 方 法 对 线 程 进 行 实 时 并 发 控 制
JVM 执 行 过 程 的 特 点 * 多 线 程 支 持 多 个 线 程 同 时 运 行, 这 些 线 程 可 以 独 立 的 执 行 Java 代 码, 处 理 公 共 数 据 区 和 私 有 堆 栈 中 的 数 据 动 态 连 接 动 态 连 接 使 得 Java 程 序 适 合 在 网 上 运 行 异 常 处 理 提 供 了 可 靠 的 异 常 处 理
Java 平 台 提 供 特 性 * Java 平 台 的 每 个 完 整 实 现 都 能 提 供 如 下 特 性 : 开 发 工 具 API 开 发 工 具 提 供 进 行 编 译 运 行 监 视 调 试 应 用 程 序 和 编 写 应 用 程 序 文 档 所 需 的 所 有 功 能 提 供 Java 编 程 语 言 的 核 心 功 能, 提 供 大 量 已 编 写 好 的 类 部 署 技 术 JDK 软 件 提 供 标 准 机 制, 用 于 把 应 用 程 序 部 署 给 最 终 用 户 用 户 界 面 工 具 包 Swing 和 Java 2D 工 具 包 使 创 建 复 杂 的 图 形 用 户 界 面 称 为 可 能 集 成 库 支 持 数 据 库 访 问 和 远 程 对 象 的 操 纵 等
Java 与 C/C++ 的 比 较 * 概 述 Java 是 由 C++ 发 展 而 来, 保 留 了 C++ 的 大 部 分 内 容, 其 编 程 方 式 类 似 于 C++, 但 是 摒 弃 了 C++ 的 诸 多 不 合 理 之 处, 从 根 本 上 解 决 了 C++ 的 固 有 缺 陷 使 得 Java 句 法 更 清 晰 规 模 更 小 更 易 学, 同 时 更 趋 于 健 壮 性 安 全 性 和 平 台 无 关 性 区 别 全 局 变 量 C++ 将 函 数 和 变 量 定 义 为 全 局 的, 而 不 加 封 装, 增 加 了 程 序 的 负 担, 并 且 往 往 会 由 于 使 用 不 当 而 造 成 系 统 的 崩 溃 Java 是 完 全 面 向 对 象 的 语 言, 类 将 方 法 和 数 据 封 装 在 其 内, 不 能 在 所 用 的 类 之 外 定 义 程 序 的 全 局 变 量, 只 能 通 过 在 一 个 类 中 定 义 公 用 静 态 的 变 量 来 实 现 一 个 全 局 变 量, 使 得 其 它 类 可 以 访 问 和 修 改 该 变 量 这 种 完 善 的 包 装 保 证 了 系 统 的 安 全 性
goto 语 句 goto 语 句 一 般 用 于 无 条 件 转 移 子 程 序 和 多 结 构 分 支 技 术, 是 C++ 中 的 合 法 语 句, 造 成 了 程 序 结 构 的 混 乱, 不 易 理 解 指 针 Java 不 提 供 goto 语 句, 使 得 程 序 更 简 洁 易 读, 增 强 了 程 序 的 健 壮 性 指 针 是 C++ 语 言 中 最 灵 活 也 最 容 易 出 错 的 数 据 类 型, 易 出 现 由 于 指 针 误 操 作 而 导 致 的 系 统 崩 溃, 同 时 指 针 操 作 内 存 时 也 经 常 出 错 Java 没 有 指 针 的 概 念, 更 有 利 于 程 序 的 安 全 内 存 管 理 C++ 语 言 中 必 须 通 过 程 序 释 放 内 存 资 源, 增 加 了 程 序 设 计 者 的 负 担, 再 次 释 放 已 释 放 的 内 存 块 或 释 放 未 分 配 的 内 存 块 会 造 成 系 统 崩 溃, 忘 记 释 放 不 再 使 用 的 内 存 块 也 会 逐 渐 耗 尽 系 统 资 源 Java 自 动 进 行 内 存 回 收 操 作, 当 一 个 对 象 不 再 被 用 到 时, 无 须 使 用 内 存 回 收 器, 只 需 要 给 它 加 上 标 签 以 示 删 除 无 用 内 存 的 回 收 器 在 后 台 运 行, 利 用 空 闲 时 间 工 作, 保 证 了 系 统 资 源 的 完 整 性, 避 免 了 内 存 管 理 不 School of Computer 周 而 引 起 Science 的 系 统 崩 and 溃 Technology
数 据 类 型 的 一 致 性 在 C++ 语 言 中, 不 同 的 平 台 上, 编 译 器 对 简 单 数 据 类 型 分 别 分 配 不 同 的 字 节 数, 导 致 了 代 码 数 据 的 不 可 移 植 性 在 Java 中, 采 用 基 于 IEEE 标 准 的 数 据 类 型, 无 论 任 何 硬 件 平 台 上 对 数 据 类 型 的 位 数 分 配 总 是 固 定 的 类 型 转 换 在 C++ 中, 会 出 现 数 据 类 型 的 隐 含 转 换, 涉 及 到 自 动 强 制 类 型 转 换, 使 得 不 安 全 因 素 大 大 增 加 Java 中 系 统 要 对 对 象 的 处 理 进 行 严 格 的 相 容 性 检 查, 防 止 不 安 全 的 转 换 如 果 需 要, 必 须 由 程 序 显 式 进 行 强 制 类 型 转 换 头 文 件 在 C++ 语 言 中 使 用 头 文 件 声 明 类 的 原 型 和 全 局 变 量 及 库 函 数 等, 使 得 在 大 系 统 中 对 头 文 件 的 维 护 非 常 困 难 Java 不 支 持 头 文 件, 类 成 员 的 类 型 和 访 问 权 限 都 封 装 在 类 中, 运 行 时 系 统 对 访 问 进 行 控 制, 防 止 非 法 访 问
结 构 和 联 合 C++ 中 用 结 构 和 联 合 来 表 示 一 定 的 数 据 结 构, 其 成 员 的 公 有 性 带 来 了 安 全 隐 患 Java 不 支 持 结 构 和 联 合, 通 过 类 把 数 据 结 构 及 对 该 数 据 的 操 作 封 装 在 类 中 预 处 理 C++ 在 编 译 过 程 中 都 有 一 个 预 编 译 阶 段, 即 预 处 理 器, 为 开 发 人 员 提 供 了 方 便, 但 也 增 加 了 编 译 的 复 杂 性 Java 允 许 预 处 理, 但 不 支 持 预 处 理 器 功 能, 提 供 import 语 句 实 现 类 似 的 功 能 多 重 继 承 C++ 支 持 多 重 继 承, 允 许 许 多 父 类 派 生 一 个 子 类, 虽 然 功 能 强 大, 但 使 用 复 杂, 而 且 会 引 起 许 多 麻 烦, 编 译 程 序 实 现 也 很 不 易 Java 不 支 持 多 重 继 承, 但 允 许 一 个 类 实 现 多 个 接 口, 即 实 现 了 C++ 的 多 重 继 承 功 能, 又 避 免 了 C++ 的 缺 陷
操 作 符 重 载 函 数 操 作 符 重 载 被 认 为 是 C++ 的 突 出 特 征 为 了 保 持 Java 语 言 尽 可 能 的 简 单,Java 不 支 持 操 作 符 重 载 在 C 中, 代 码 组 织 在 函 数 中, 函 数 可 以 访 问 程 序 的 全 局 变 量 ;C++ 增 加 了 类, 提 供 了 类 方 法, 但 由 于 C++ 仍 然 支 持 C, 所 以 C++ 程 序 中 仍 然 可 以 使 用 C 的 函 数, 结 果 导 致 函 数 和 方 法 混 合 使 用, 使 得 程 序 比 较 混 乱 Java 没 有 函 数 作 为 一 种 比 C++ 更 纯 的 面 向 对 象 的 语 言, 强 迫 开 发 人 员 把 所 有 例 行 程 序 包 括 在 类 中, 可 以 更 好 的 组 织 编 码 字 符 串 C++ 不 支 持 字 符 串 变 量, 使 用 Null 终 止 符 代 表 字 符 串 的 结 束 Java 字 符 串 类 作 为 Java 语 言 的 一 部 分 定 义, 而 不 是 作 为 外 加 的 延 伸 部 分, 在 整 个 系 统 中 建 立 字 符 串 和 访 问 字 符 串 元 素 的 方 法 是 一 致 的
是 否 直 译 式 效 用 是 Java 否, 编 译 式 C/C++ 编 译 后 是 否 产 生 机 器 代 码 是 否 跨 平 台 是 否 有 指 针 类 型 是 否 具 备 继 承 性 能 运 行 速 度 快 慢 否, 产 生 具 有 跨 平 台 特 性 的 字 节 码 是 否, 使 用 对 象 引 用 代 替 指 针 允 许 单 一 继 承 较 C/C++ 略 慢 是 否, 需 根 据 计 算 机 平 台 改 变 程 序 是 允 许 多 重 继 承 快