资源介绍
第 一 章 Java概 述
§ 1.1 Java语 言 出 现 的 背景 、 影 响 及 应 用 前 景
一 、 背 景
最 近 一 年 多 来 ,在 Internet上 出 现 的 特 别 吸 引 人 的 事 件 就是 Ja va语 言 和 用 Java编 写 的 浏 览 器 HotJava。
1991年 ,SUN MicroSystem 公 司 的 Jame Gosling、 Bill Joe等 人 , 为 在电视 、 控 制 烤 面 包箱 等 家 用 消 费 类 电 子 产 品 上 进 行 交 互 式操 作 而 开 发 了 一 个 名为 Oak的 软 件 (即一 种 橡 树 的 名 字 ), 但当 时 并 没 有 引 起 人 们 的 注 意 ,直 到 1994年下 半 年 ,Internet的 迅猛发 展 ,环 球 信 息 网 WWW的 快 速 增 长 ,促 进 了 Java 语 言 研 制 的 进展 ,使 得 它 逐 渐 成为 Int ernet上 受 欢 迎 的 开 发 与 编 程 语 言 ,一 些著 名 的 计 算 机 公司 纷 纷 购 买 了 Java 语言 的 使 用 权 ,
如 Mi-croSoft、 IBM、 Netscape、 Novell、 Apple、 DEC、 SGI 等,因 此 ,Java 语言 被 美 国 的 著 名 杂 志 PC Magazine 评 为 1995年 十 大 优 秀科 技 产 品,(计 算 机 类 就 此 一项 入 选 ),随 之 大 量 出 现 了 用 Java编写 的 软 件 产 品 ,受 到 工 业 界的 重 视 与 好 评 ,认 为 "Java是八 十 年 代 以 来 计 算 机 界 的 一 件 大 事 ",
微 软 总 裁 比 尔 ·盖 茨 在 悄 悄 地 观 察了 一 段 时 间 后 ,不 无感 慨 地 说 :"Java是 长 时 间 以 来 最 卓 越 的 程序 设 计 语 言 ",并确 定 微软 整 个 软 件 开 发 的 战 略 从 PC 单 机 时 代 向 着 以 网 络为中 心 的 计 算 时 代 转 移 ,而 购 买 Java则 是 他 的 重 大 战 略 决 策的实施 部 署 。因 此 ,Java的 诞 生 必 将 对 整 个 计 算 机 产 业 发 生 深远的 影 响,对 传 统 的 计 算 模型 提 出 了 新 的 挑 战 。
SUN MicroSystem 公 司 的 总 裁 Scott McNealy认 为 Java为 Internet和WWW开辟 了 一 个崭 新 的 时 代 .
环 球 信 息 网 WWW的 创 始 人 Berners-Lee说 : "计 算 机 事 业 发展 的下 一 个 浪 潮 就是 Java,并 且 将 很 快 会 发 生 的 "。看 来 ,使 用 Java已 成 大 势 所 趋 !
MicroSoft 和 IBM 两 大 公 司 都 计 划 在 Internet上 销 售 用 Java 编写的 软 件 。
Apple、 HP、 IBM、 MicroSoft、 Novell、 SGI、 SCO、 Tandem 等 公 司均计 划 将 Java并入 各 自 开 发 的 操 作系 统 ,而 负 责 开 发 并 推 广 Java技 术 的 SunSoft公司 (这 是 SUN下 属的 一 个 子 公 司 ), 将 通 过 颁发 许 可 证 的 办 法 来 允 许 各 家 公 司 把Java虚 拟 机 和 Java的Applets类库 嵌 入 他 们 开 发 的 操 作 系 统 ,这 样 各 类 开 发 人 员 就 能更 容易 地 选 择 多种 平 台 来 使 用 Java语 言 编 程 ,不 同 的 用 户 也 就 可以 脱 离 Web浏 览器 来 运 行 Java应 用程 序 ,这 无 疑 是 很 受 广 大 用户 欢 迎 的 ,也 为 Java语 言 的 应 用 开 拓了极为 广 阔 的 前景 。 (当然 ,各 类 JavaOS之 间 的 兼 容 性 必 须 得 到 重 视 ,好 在JavaSoft已 保证 将 监 督 这种 兼 容 性 )。
另 外 ,由 JavaSoft 推 出 的 完 全 用 Java编 写 的 Internet上 新 型 浏览器 HotJava,比 去 年alpha版 更 为 实 用 ,不 仅 能 编 制 动 态 的 应 用 软件 ,而 且 能 编 制 完整 的 成 套 桌 面 应 用软 件 ,将 来 还 会 提 供 更多 的 能 帮 助 编 制 动 态 应 用 软 件 的 模 块,显 然 ,这 也 是 为 J ava的应 用 提 供 了 有 力 的 例 证 。
今 年 6月 7日 ,由 SUN公 司 和 台 湾 经 济 事 务 部 信 息 发 展 局, *信 息 技 术 研究 所 等 单 位 牵 头 ,成 立 了 一 个 "Java联 盟 ", 参 加 的 有 22个 在 台 湾相 当 著 名 的 计 算 机公 司 ,并 在 台 北 建 立一 个 "Java 开 发 中 心 ",在 新 竹 建 立 一 个 "Java语 言实 验 室 ", 以 掀起 台 湾 开 发 与 应 用 Java 语 言 的 热 潮 。
香 港 则 在 今 年 4月 就 举 行 了 全 岛 的 Java杯 比 赛 ,在 计 算 机界掀 起 了 学 习 Java的热 潮 (尤 其 是 在 大 学 生 们 中 ,出 现 了 一 批 Java迷 )。
有 人 预 言 :Java将 是 网 络 上 的 "世 界 语 ",今 后 所 有的 用 其 他语 言 编 写 的 软 件统 统 都 要 用 Java 语 言 来 改 写 。
二 、 Java 语 言 对 软 件 开 发 技 术 的 影 响
工 业 界 不 少 人 预 言 :"Java 语 言 的 出 现 ,将 会 引 起 一 场软 件革 命 ",这 是 因 为 传统 的 软 件 往 往 都 是 与 具 体 的 实现 环 境 有 关 ,换 了 一 个 环 境 就需 要 作 一 番 改 动 ,耗时 费 力 ,而 Java 语 言 能 在 执 行 码 (二 进 制 码 )上 兼 容 ,这 样 以 前 所开 发 的软 件 就 能 运行 在 不 同 的 机 器 上 ,只 要 所 用 的 机 器 能 提供 Java 语 言 解 释 器 即可 。
Java 语 言 将 对 未 来 软 件 的 开 发 产 生 影 响 , 可 从 如 下 几 个方面 考 虑 :
1 软 件 的 需 求 分 析 :可 将 用 户 的 需 求 进 行 动 态 的 、 可 视化描 述 ,以 提供设 计者 更 加 直 观 的 要 求 。 而 用 户 的 需 求 是 各色 各 样 的 ,不 受 地 区、 行 业 、 部 门 、 爱好 的 影 响 ,都 可 以 用 Java 语 言 描 述 清 楚 。
2 软 件 的 开 发 方 法 :由 于 Java 语 言 的 面 向 目 标 的 特 性 , 所以完 全 可 以 用 O-O的技 术 与 方 法 来 开 发 ,这 是 符 合 最 新 的 软件 开 发 规 范 要 求 的 。
3 Java 语 言 的 动 画 效 果 远 比 GUI技 术 更 加 逼 真 ,尤 其 是 利用WW W提 供 的 巨 大动 画 资 源 空 间 ,可 以 共 享 全 世 界 的 动 态 画面 的 资 源 。
4 软 件 最 终 产 品 :用 Java 语 言 开 发 的 软 件 可 以 具 有 可视化 、 可 听 化 、 可 操作 化 的 效 果 ,这 要 比 电 视 、 电 影 的 效果 更 为 理 想 ,因 为 它 可 以做 到 "即 时 、 交 互、 动 画 与 动作 ",要 它 停 就 停 ,要 它 继 续 就 继 续 ,而 这 是 在 电 影与 电视 播 放 过 程 中难 以 做 到 的 。
5 其 它 :使 用 Java 语 言 对 开 发 效 益 、 开 发 价 值 都 有 比 较明显 的 影 响 。
三 、 工 业 界 对 Java 语 言 的 评 价
1996年 5月 29 ~ 31日 ,在 美 国 旧 金 山 召 开 了 一 个 全 世 界 Java语言 开 发 者 大 会,(JavaOne Developer Confer-ence),出 席 会 议 的 多 达 6500多 人 ,来 自 工 业界 的 超 过 一 半 ,有人 评 价 说 :"这 是 近年 来 计 算 机 界 最 光 辉 的 一 次 盛 会 ",一 些 工 业 界 的 老 总们 相 当看 好 Java 语 言 ,认 为 它 的 使 用 将 会 引 起 一 场 软 件 革命 。 从 软 件的 设 计 风 格 、 设计 方 法 、 设 计 目 标 到 设 计 过 程 ,都 会 产 生 彻 底 的 变 革 ,"甚 至 会改 变 此 星 球 的 生活 方 式 "。
在 这 次 会 上 ,Java的 创 始 人 之 一 James Gosling 说 :"Java 不仅 仅只 是 applets, 它 能 做任 何 事 情 ",Dta 咨 询 公 司 的 高 级软 件 工 程 师 Rich Kadel说 :"Java 不仅 仅 是 一 种 程 序 设计 语言 ,更 是 现 代 化 软 件 再 实 现 的 基 础 ;Java 还 是 未 来 新 型 OS的核 心 ;将 会 出 现Java 芯 片 ;将 构 成 各 种 应 用 软 件 的 开 发 平 台与 实 现 环 境 ,是 人们 必 不 可 少 的 开 发工 具 "。
由 于 各 界 都 看 好 它 ,因 此 ,各 大 公 司 都 纷 纷 表 示 支 持 Java,Inte l、 Xerox公 司 声 言将 把 Java嵌 入 到 他 们 的 产 品 中 去 。 就 连 华尔 街 金 融 界 也 在 投入 资 金 人 力 用 Java开 发 电 子 贸 易 、 金 融软 件 。
所 以 有 人 说 :"现 在 第 三 方 的 开 发 商 都 团 结 在 Java大旗 周 围了 !",纷 纷 推 出 用Java 开 发 的 各 种 软 件 产 品 ,以 期尽 快 地 占 领 市 场 。
四 、 Java 语 言 的 应 用 前 景
Java 语 言 有 着 广 泛 的 应 用 前 景 ,大 体 上 可 以 从 以 下 几 个方面 来 考 虑 其 应 用 :
1 所 有 面 向 对 象 的 应 用 开 发 ,包 括 面 向 对 象 的 事 件 描 述、处 理 、 综 合 等 ;
2 计 算 过 程 的 可 视 化 、 可 操 作 化 的 软 件 的 开 发 ;
3 动 态 画 面 的 设 计 ,包 括 图 形 图 像 的 调 用 ;
4 交 互 操 作 的 设 计 (选 择 交 互 、 定 向 交 互 、 控 制 流 程 等 );
5 Internet的 系 统 管 理 功 能 模 块 的 设 计 ,包 括 Web页 面 的 动 态设计 、 管 理 和 交互 操 作 设 计 等 ;
6 Intranet(企 业 内 部 网 )上 的 软 件 开 发 (直 接 面 向 企 业 内 部用户 的 软 件 );
7 与 各 类 数 据 库 连 接 查 询 的 SQL 语 句 实 现 ;
8 其 它 应 用 类 型 的 程 序 。
§ 1.2 Java的 特 点
Java是 一 个 广 泛 使 用 的 网 络 编 程 语 言 ,它 是 一 种 新 的 计算概 念 。
首 先 ,作 为 一 种 程 序 设 计 语 言 ,它 简 单 、 面向对象 、 不依 赖于 机 器 的 结 构 、具 有 可 移 植 性 、 鲁 棒 性 、 安 全 性 、 并 且提 供 了 并 发 的 机 制 、具 有 很 高 的 性 能。
其 次 ,它 最 大 限 度 地 利 用 了 网 络 ,Java的小应用程序(applet) 可在网 络 上 传 输 而 不受 CPU和 环 境 的 限 制 。 另 外 ,Java还 提 供 了 丰富 的 类 库 ,使 程 序 设计 者 可 以 很 方 便地 建 立 自 己 的 系 统 。
下 面 我 们 分 别 从 这 三 个 方 面 来 讨 论 Java的 特 点 ,然 后通 过把 Java与 C,C++相 比进 一 步 指 出 它 所 具 有 的 优 点 。
一 、 Java语 言
Java语 言 有 下 面 一 些 特 点 :简 单 、 面 向 对 象 、 分 布 式 、解释 执 行 、 鲁 棒 、安 全 、 体 系 结 构 中 立 、 可 移 植 、 高 性 能、 多 线 程 以 及 动 态 性。
1.简 单 性
Java语 言 是 一 种 面 向 对 象 的 语 言 ,它 通 过 提 供 最 基 本 的方法 来 完 成 指 定 的任 务 ,只 需 理 解 一 些 基 本 的 概 念 ,就 可 以用 它 编 写 出 适 合 于 各种 情 况 的 应 用 程 序。 Java略 去了 运 算 符重 载 、 多 重 继 承 等 模 糊 的 概 念 ,并 且 通 过实 现 自 动 垃 圾 收集大 大 简 化 了 程 序 设 计 者 的 内 存 管 理 工 作 。 另 外 ,Java也 适合于 在 小 型 机 上 运行 ,它 的 基 本 解 释 器 及 类 的 支 持 只 有 40KB左右 ,加 上 标 准 类 库 和线 程 的 支 持 也 只 有 215KB左 右 。 库 和 线程 的 支 持 也 只 有 2 15KB左 右 。
2.面 向 对 象
Java语 言 的 设 计 集 中 于 对 象 及 其 接 口 ,它 提 供 了 简 单 的类机 制 以 及 动 态 的接 口 模 型 。 对 象 中 封 装 了 它 的 状 态 变 量以 及 相 应 的 方 法 ,实现 了 模 块 化 和 信 息隐 藏 ;而 类 则 提 供 了一 类 对 象 的 原 型 ,并 且 通 过 继 承 机 制 ,子 类可 以 使 用 父 类 所提供 的 方 法 , 实 现 了 代 码 的 复 用 。
3.分 布 性
Java是 面 向 网 络 的 语 言 。 通 过 它 提 供 的 类 库 可 以 处 理TCP/IP协议 ,用 户 可 以通 过 URL地 址 在 网 络 上 很 方 便 地 访 问 其 它 对 象。
4.鲁 棒 性
Java在 编 译 和 运 行 程 序 时 ,都 要 对 可 能 出 现 的 问 题 进 行检查 ,以 消 除 错 误 的产 生 。 它 提 供 自 动 垃 圾 收 集 来 进 行 内存 管 理 ,防 止 程 序 员 在管 理 内 存 时 容 易 产生 的 错 误 。 通 过集 成 的 面 向 对 象 的 例 外 处 理 机 制 ,在 编 译 时,Java提 示 出 可能 出现 但 未 被 处 理 的 例 外 ,帮 助 程 序 员 正 确 地 进 行 选 择 以防 止 系统 的 崩 溃 。 另 外,Java在 编 译 时 还 可 捕 获 类 型 声 明 中的 许 多 常 见 错 误 ,防 止 动 态运 行 时 不 匹 配 问题 的 出 现 。
5.安 全 性
用 于 网 络 、 分 布 环 境 下 的 Java必 须 要 防 止 病 毒 的 入 侵 。Java 不 支 持 指 针 ,一切 对 内 存 的 访 问 都 必 须 通 过 对 象 的 实 例 变量 来 实 现 ,这 样 就防 止 程 序 员 使 用 "特洛 伊 " 木 马 等欺 骗 手 段 访 问 对 象 的 私 有 成 员 ,同 时 也 避 免 了指 针 操 作 中容 易 产 生的 错 误 。
6.体 系 结 构 中 立
Java解 释 器 生 成 与 体 系 结 构 无 关 的 字 节 码 指 令 ,只 要 安装了 Java运 行 时 系 统,Java程 序 就 可 在 任 意 的 处 理 器 上 运 行 。这 些 字 节 码 指 令 对 应于 Java虚 拟 机 中 的表 示 ,Java 解 释 器 得到 字 节 码 后 ,对 它 进 行 转 换 ,使 之 能 够 在 不同 的 平 台 运 行 。
7.可 移 植 性
与 平 台 无 关 的 特 性 使 Java程 序 可 以 方 便 地 被 移 植 到 网 络上的 不 同 机 器 。同 时 ,Java的 类 库 中 也 实 现 了 与 不 同 平 台 的 接口 ,使 这 些 类 库 可以 移 植 。 另 外 ,Java编 译 器 是 由 Java语 言 实现 的 ,Java运 行 时 系 统 由 标 准 C实 现 ,这使 得 Java系 统 本 身 也具有 可 移 植 性 。
8.解 释 执 行
Java解 释 器 直 接 对 Java字 节 码 进 行 解 释 执 行 。 字 节 码 本身携 带 了 许 多 编 译时 信 息 ,使 得 连 接 过 程 更 加 简 单 。
9.高 性 能
和 其 它 解 释 执 行 的 语 言 如 BASIC、 TCL不 同 ,Java字 节 码 的 设计使 之 能 很 容 易地 直 接 转 换 成 对 应 于 特 定 CPU 的 机 器 码 ,从 而得 到 较 高 的 性 能。
10.多 线 程
多 线 程 机 制 使 应 用 程 序 能 够 并 行 执 行 ,而 且 同 步 机 制 保证了 对 共 享 数 据 的正 确 操 作 。 通 过 使 用 多 线 程 ,程 序 设 计 者可 以 分 别 用 不 同 的线 程 完 成 特 定 的 行为 ,而不 需 要 采 用 全 局的 事 件 循 环 机 制 ,这 样 就 很 容 易 地 实 现 网 络 上 的 实 时 交 互行为 。
11.动 态 性
Java的 设 计 使 它 适 合 于 一 个 不 断 发 展 的 环 境 。 在 类 库 中可以 自 由 地 加 入新 的 方 法 和 实 例 变 量 而 不 会 影 响 用 户 程 序的 执 行 。 并 且Java通 过 接 口 来 支 持 多重 继 承 ,使 之 比 严 格 的类 继 承 具 有 更 灵 活 的 方 式 和 扩 展 性 。
二 、 Java Applet
Java语 言 的 特 性 使 它 可 以 最 大 限 度 地 利 用 网 络 。 Applet是Jav a的 小 应 用 程序 ,它 是 动 态 、 安 全 、 跨 平 台 的 网 络 应 用 程 序。 Java Applet嵌 入HTML语 言 ,通 过 主页 发 布 到 Internet。 网 络 用 户访 问 服 务 器 的Applet时 ,这些Applet 从网 络 上 进 行 传 输 ,然 后 在支 持 Java 的 浏 览 器 中 运 行 。 由 于 Java语 言 的 安 全 机 制,用 户一 旦 载 入Applet,就 可 以 放 心 地 来 生 成 多 媒 体 的 用 户 界 面 或完 成 复 杂 的计 算 而 不 必 担 心 病毒 的 入 侵 。 虽 然 Applet可 以 和图 像 、 声 音 、 动 画 等 一 样 从 网 络上 下 载 ,但 它 并 不同 于 这些 多 媒 体 的 文 件 格 式 ,它 可 以 接 收 用 户 的 输 入 ,动 态 地进 行改 变 ,而 不 仅 仅是 动 画 的 显 示 和 声 音 的 播 放 。
三 、 丰 富 的 类 库
Java提 供 了 大 量 的 类 以 满 足 网 络 化 、 多 线 程 、 面 向 对 象系统 的 需 要 。
1.语 言 包 提 供 的 支 持 包 括 字 符 串 处 理 、 多 线 程 处 理 、例外 处 理 、 数 学 函数 处 理 等 ,可 以 用 它 简 单 地 实 现 Java 程 序的 运 行 平 台 。
2.实 用 程 序 包 提 供 的 支 持 包 括 哈 希 表 、 堆 栈 、 可 变 数组、 时 间 和 日 期 等。
3.输 入 输 出 包 用 统 一 的 "流 "模 型 来 实 现 所 有 格式 的 I/O,包括 文 件 系 统 、 网 络、 输 入 /出 设 备 等 。
4.低 级 网 络 包 用 于 实 现 Socket编 程 。
5.抽 象 图 形 用 户 接 口 包 实 现 了 不 同 平 台 的 计 算 机 的 图形用 户 接 口 部 件 ,包括 窗 口 、 菜 单 、 滚 动 条 、 对 话 框 等 ,使得 Java可 以 移 植 到 不 同平 台 的 机 器 。
6.网 络 包 支 持 Internet的 TCP/IP协 议 ,提 供 了 与 Internet的 接 口。它 支 持 URL连 接,WWW的 即 时 访 问 ,并 且 简 化 了 用 户 /服 务 器 模型 的 程 序 设 计 。
四 、 Java和 C、 C++
对 于 变 量 声 明 、 参 数 传 递 、 操 作 符 、 流 控 制 等 ,Java 使用了 和 C、 C++相 同的 传 统 ,使 得 熟 悉 C、 C++的 程 序 员 能 很 方 便地 进 行 编 程 。 同 时,Java为 了 实 现 其简 单 、 鲁 棒 、 安 全 等 特性 ,也 摒 弃 了 C和 C++中 许 多 不 合 理 的 内容 。
1.全 局 变 量
Java程 序 中 ,不 能 在 所 有 类 之 外 定 义 全 局 变 量 ,只 能 通 过在一 个 类 中 定 义 公用 、 静 态 的 变 量 来 实 现 一 个 全 局 变 量 。例 如 :
Class GlobalVar{
public static global_var;
}
在 类 GlobalVar中 定 义 变 量 global_var为 public stat-ic,使 得 其 它类可 以 访 问 和 修 改该 变 量 。
Java对 全 局 变 量 进 行 了 更 好 的 封 装 。 而 在 C和 C++中 , 依 赖于不 加 封 装 的 全局 变 量 常 常 造 成 系 统 的 崩 溃 。
2.Goto
Java不 支 持 C、 C++中 的 goto语 句 ,而 是 通 过 例 外 处 理 语 句 try,Ca tch, final等 来 代替 C、 C++中 用 goto来 处 理 遇 到 错 误 时 跳 转 的情 况 ,使 程 序 更 可 读且 更 结 构 化 。
3.指 针
指 针 是 C、 C++中 最 灵 活 ,也 是 最 容 易 产 生 错 误 的 数 据 类型。 由 指 针 所 进 行的 内 存 地 址 操 作 常 会 造 成 不 可 预 知 的 错误 ,同 时 通 过 指 针 对某 个 内 存 地 址 进 行显 式 类 型 转 换 后 ,可以 访 问 一 个 C++中 的 私 有 成 员 ,从 而 破 坏 安全 性 ,造 成 系 统 的崩 溃 。 而 Java 对 指 针 进 行 完 全 的 控 制 ,程 序 员 不 能 直 接进行 任 何 指 针 操 作 ,例 如把 整 数 转 化 为 指 针 ,或 者 通 过 指 针释放 某 一 内 存 地 址 等 。 同时 ,数 组 作 为 类 在Java中 实 现 ,良 好 地解 决 了 数 组 访 问 越 界 这 一 C、 C++中 不 作 检 查的 错 误 。
4.内 存 管 理
在 C中 ,程 序 员 通 过 库 函 数 malloc()和 free()来 分 配 和 释 放 内存 , C++中 则 通 过 运算 符 new和 delete来 分 配 和 释 放 内 存 。 再 次 释放 已 释 放 的 内 存 块或 未 被 分 配 的 内存 块 ,会 造 成 系 统 的 崩溃 ;同 样 ,忘 记 释 放 不 再 使 用 的 内 存 块 也会 逐 渐 耗 尽 系 统资源 。 而 在 Java中 ,所 有 的 数 据 结 构 都 是 对 象 , 通 过 运 算 符 new为它们 分 配 内 存 堆。 通 过 new得 到 对 象 的 处 理 权 ,而 实 际 分 配 给对 象 的 内 存 可 能随 程 序 运 行 而 改变, Java对 此 自 动 地 进 行 管理 并 且 进 行 垃 圾 收 集 ,有 效 防 止 了 由 于程 序 员 的 误 操 作而导 致 的 错 误 ,并 且 更 好 地 利 用 了 系 统 资 源 。
5.数 据 类 型 的 支 持
在 C、 C++中 ,对 于 不 同 的 平 台 ,编 译 器 对 于 简 单 数 据 类 型如in t,float等 分 别 分配 不 同 长 度 的 字 节 数 ,例 如 :int在 IBM PC中为 16位 ,在 VAX-11中 为32位 ,这 导 致 了 代 码的 不 可 移 植 性 ,但 在 Java中 ,对 于 这 些 数 据 类 型 总 是 分 配 固 定 长 度 的 位 数 ,如 对 int型 ,它 总 占 32位 ,这 就 保 证 了 Java的 平 台 无 关 性 。
6.类 型 转 换
在 C、 C++中 ,可 以 通 过 指 针 进 行 任 意 的 类 型 转 换 ,常 常 带来不 安 全 性 ,而 Java中 ,运 行 时 系 统 对 对 象 的 处 理 要 进 行 类型 相 容 性 检 查 ,以 防 止不 安 全 的 转 换 。
7.头 文 件
C、 C++中 用 头 文 件 来 声 明 类 的 原 型 以 及 全 局 变 量 、 库 函数等 ,在 大 的 系 统中 ,维 护 这 些 头 文 件 是 很 困 难 的 。 而 Java不支 持 头 文 件 ,类 成 员的 类 型 和 访 问 权限 都 封 装 在 一 个 类 中 ,运 行 时 系 统 对 访 问 进 行 控 制 ,防 止 对 私有 成 员 的 操 作 。 同时 ,Java中 用 import语 句 来 与 其 它 类 进 行 通 讯 ,以 便 使 用它 们 的方法 。
8.结 构 和 联 合
C、 C++中 的 结 构 和 联 合 中 所 有 成 员 均 为 公 有 ,这 就 带 来了安 全 性 问 题 。Java中 不 包 含 结 构 和 联 合 ,所 有 的 内 容 都 封装 在 类 中 。
9.预 处 理
C、 C++中 用 宏 定 义 来 实 现 的 代 码 给 程 序 的 可 读 性 带 来 了困难 。 在 Java中 ,不 支 持 宏 ,它 通 过 关 键 字 final 来 声 明 一 个 常量 ,以 实 现 宏 定 义中 广 泛 使 用 的 常 量定 义 。
§ 1.3 简 单 的 Java程 序
下 面 我 们 先 介 绍 两 个 简 单 的 Java程 序 ,并 对 其 进 行 分 析。
例 1.1.
public class HelloWorldApp { //an application
public static void main (String args[ ]){
System.out.println("Hello World!");
}
}
本 程 序 的 作 用 是 输 出 下 面 一 行 信 息 :
Hello World!
程 序 中 ,首 先 用 保 留 字 class来 声 明 一 个 新 的 类 ,其 类 名 为Hell oWorldApp,它 是 一 个公 共 类 (public)。 整 个 类 定 义 由 大 括 号 {}括起 来 。 在 该 类 中 定义 了 一 个 main ()方 法 ,其中 public表 示 访 问权 限 ,指 明 所 有 的 类 都 可 以 使 用 这 一 方 法 ;static指 明 该 方法 是 一 个 类方 法 ,它 可 以 通 过 类 名 直 接 调 用 ;void则 指 明 main()方法 不 返 回 任何 值 。 对 于 一 个 应 用程 序 来 说 ,main()方 法 是 必需 的 ,而 且 必 须 按 照 如 上 的 格 式 来 定义 。 Jave解 释 器 在 没 有生成 任 何 实 例 的 情 况 下 ,以 main()作 为 入 口 来 执 行 程 序 。 Jave程序中 可 以 定 义 多 个 类 , 每 个 类 中 可 以 定 义 多 个 方 法 ,但 是 最多 只 能 有 一 个 公 共 类,main()方 法 也 只 能 有 一 个 ,作 为 程 序 的入 口 。 main()方 法 定 义 中 ,括 号 ()中 的 String args[ ]是传 递 给 main()方法 的 参 数 ,参 数 名 为 args,它 是 类 String的 一 个 实 例 ,参 数 可 以为 0个 或 多 个,每 个 参 数 用 "类 名 参数 名 "来 指 定 , 多个 参 数 间 用 逗 号 分 隔 。 在 main()方 法 的 实 现(大 括 号 中 ),只有 一 条 语句 :
System.out.println ("Hello World!"); 它 用 来 实 现 字 符串 的 输 出 ,这 条 语 句 实 现 与 C语 言 中 的printf 语 句 和 C++中 cout<<语句 相 同 的 功 能 。 另 外 ,//后 的 内 容 为 注 释 。
现 在 我 们 可 以 运 行 该 程 序 。 首 先 把 它 放 到 一 个 名 为HelloWor ldApp.java的 文 件 中 ,这 里 ,文 件 名 应 和 类 名 相 同 ,因 为 Java解释 器 要 求 公 共 类 必 须 放在 与 其 同 名 的 文 件 中。 然 后 对 它 进行 编 译 :
C:\>javac HelloWorldApp.java
编 译 的 结 果 是 生 成 字 节 码 文 件 HelloWorldApp.class。最 后 用java 解 释 器 来 运 行 该字 节 码 文 件 :
C:\>java HelloWorldApp
结 果 在 屏 幕 上 显 示 Hello World!
我 们 再 来 看 下 面 的 一 个 例 子 : 例 1.2
import java.awr.*;
import java.applet.*;
public class HelloWorldApplet extends Applet { //an applet
public void paint(Graphics g){
g.drawString ("Hello World!",20,20);
}
}
这 是 一 个 简 单 的 Applet(小 应 用 程 序 )。 程 序 中 ,首 先 用 import语句 输 入 java.awr和java.applet下 所 有 的 包 ,使 得 该 程 序 可 能 使 用这 些 包 中 所 定 义 的类 , 它 类 似 于 C中 的#include 语 句 。 然 后 声明 一 个 公 共 类 HelloWorldApplet,用 extends指明 它 是 Applet的 子 类。 在类 中 ,我 们 重 写 父 类 Ap-plet的 paint()方 法 ,其 中 参 数 g为 Graphics类,它表 明 当 前 作 画 的 上下 文 。 在 paint()方 法 中 ,调 用 g的 方 法 drawString(),在坐 标 (20,20)处输 出 字 符 串 ""Hello World!",其 中 坐 标是 用 象 素 点 来 表 示 的 。
这 个 程 序 中 没 有 实 现 main()方 法 ,这 是 Applet与 应 用 程序 Applica tion(如 例 1)的 区 别 之一 。 为 了 运 行 该 程 序 ,首 先 我们 也 要 把它 放 在 文 件HelloWorldAppl et.java中 ,然 后 对 它 进行 编 译 :
C:\>javac HelloWorldApplet.java
得 到 字 节 码 文 件 HelloWorldApplet.class。 由 于 Applet中 没 有main()方法 作 为 Java解 释 器的 入 口 ,我 们 必 须 编 写 HTML文 件 ,把 该 Applet嵌入 其 中 ,然 后 用 appletviewer来 运 行 ,或 在支 持 Java的 浏 览 器 上运 行 。 它 的 <HTML>文 件 如 下 :
<HTML>
<HEAD>
<TITLE> An Applet </TITLE>
</HEAD>
<BODY>
<applet code="HelloWorldApplet.class" width=200 height=40>
</applet>
</BODY>
</HTML>
其 中 用 <applet>标 记 来 启 动 HelloWorldApplet,code指 明字 节 码所在 的 文 件 ,width和height指 明 applet所 占 的 大 小 ,我 们 把 这 个 HTML文件 存 入Example.html,然 后 运 行 :
C:\>appleviewer Example.html
这 时 屏 幕 上 弹 出 一 个 窗 口 ,其 中 显 示 Hello World!,显 示 结果如 图 :
从 上 述 例 子 中 可 以 看 出 ,Java程 序 是 由 类 构 成 的 ,对 于 一个应 用 程 序 来 说 ,必 须有 一 个 类 中 定 义 main()方 法 ,而 对 applet来说 ,它 必 须 作 为 Applet的一 个 子 类 。 在 类 的 定 义 中 ,应 包 含 类变 量 的 声 明 和 类 中 方 法 的 实 现 。 Java在 基 本 数据 类 型 、 运算 符 、 表达 式 、 控 制 语 句 等 方 面 与 C、 C++基 本 上 是 相 同 的 ,但 它 同 时 也增 加 了 一 些 新 的 内 容 ,在 以 后 的 各 章 中 ,我 们会 详 细 介 绍 。 本 节 中 ,只 是 使 大 家 对Java程 序 有 一 个 初 步 的了解 。
第 二 章 数 据 类 型
§ 2.1 数 据 类 型
数 据 类 型 指 明 了 变 量 或 表 达 式 的 状 态 和 行 为 。 Java 的数据 类 型 如 下 所 示 :
Java不 支 持 C、 C++中 的 指 针 类 型 、 结 构 体 类 型 和 共 用 体类型 。
本 章 我 们 主 要 介 绍 简 单 类 型 。
§ 2.2 常 量 与 变 量
一 、 常 量
Java中 的 常 量 值 是 用 文 字 串 表 示 的 ,它 区 分 为 不 同的 类 型,如整 型 常 量 123,实 型常 量 1.23,字 符 常 量 ‘ a’ ,布 尔 常 量 true、 false以 及 字 符 串 常 量"This is a constant string."。
与 C、 C++不 同 ,Java中 不 能 通 过 #define命 令 把 一 个 标 识 符 定义为 常 量 ,而 是 用 关键 字 final来 实 现 ,如
final double PI=3.14159( 有 关 final的 用 法 见[6.2.3])。
二 、 变 量
变 量 是 Java程 序 中 的 基 本 存 储 单 元 ,它 的 定 义 包 括 变 量名、 变 量 类 型 和 作 用 域几 个 部 分 。
① 变 量 名 是 一 个 合 法 的 标 识 符 ,它 是 字 母 、 数 字 、 下 划线或 美 元 符 "$ "的 序 列,Java对 变 量 名 区 分 大 小 写 ,变量 名 不 能 以 数 字 开 头 ,而 且 不 能为 保 留 字 。 合 法 的 变 量 名如 :myName、 value-1、 dollar$ 等 。 非 法 的 变 量 名 如 : 2mail、room#、 class (保 留 字 )等 ,变量 名 应 具 有 一 定 的 含 义 ,以 增 加 程 序 的可 读 性 。
② 变 量 类 型 可 以 为 上 面 所 说 的 任 意 一 种 数 据 类 型 。
③ 变 量 的 作 用 域 指 明 可 访 问 该 变 量 的 一 段 代 码 。 声 明一个 变 量 的 同 时 也 就指 明 了 变 量 的 作 用 域 。 按 作 用 域 来 分 ,变 量 可 以 有 下 面 几 种:局 部 变 量 、 类 变 量 、方 法 参 数 、 例外 处 理 参 数 。
局 部 变 量 在 方 法 或 方 法 的 一 块 码 中 声 明 ,它 的 作 用域 为它 所 在 的 代 码 块 (整 个 方 法 或 方 法 中 的 某 块 代 码 )。
类 变 量 在 类 中 声 明 ,而 不 是 在 类 的 某 个 方 法 中 声 明 , 它的作 用 域 是 整 个 类 。
方 法 参 数 传 递 给 方 法 ,它 的 作 用 域 就 是 这 个 方 法 。
例 外 处 理 参 数 传 递 给 例 外 处 理 代 码 ,它 的 作 用 域 就 是 例外处 理 部 分 。
在 一 个 确 定 的 域 中 ,变 量 名 应 该 是 唯 一 的 。 通 常 , 一 个域用 大 括 号 {}来 划 定 。
④ 变 量 的 声 明 格 式 为 :
type identifier[=value][,identifier[=value]… ];
例 如 : int a, b, c;
double d1, d2=0.0;
其 中 ,多 个 变 量 间 用 逗 号 隔 开 ,d2=0.0对 实 型 变 量 d2赋 初 值0.0, 只 有 局 部 变 量 和 类变 量 是 可 以 这 样 赋 初 值 的 ,而 方 法 参 数和 例 外 处 理 参 数 的 变量 值 是 由 调 用 者 给 出的 。
§ 2.3 整 型 数 据
一 、 整 型 常 量 :
与 C,C++相 同 ,Java的 整 常 数 有 三 种 形 式 :
① 十 进 制 整 数 ,如 123,-456,0
② 八 进 制 整 数 ,以 0开 头 ,如 0123表 示 十 进 制 数 83,-011 表 示十进 制 数 -9。
③ 十 六 进 制 整 数 ,以 0x或 0X开 头 ,如 0x123表 示 十 进 制 数291,-0X12 表 示 十 进 制 数 -18。
整 型 常 量 在 机 器 中 占 32位 ,具 有 int型 的 值 ,对 于 long 型 值 ,则要 在 数 字 后 加 L或 l,如123L表 示 一 个 长 整 数 ,它 在 机 器 中 占 64位 。
二 、 整 型 变 量 :
整 型 变 量 的 类 型 有 byte、 short、 int、 long四 种 。 下 表 列 出各类 型 所 在 内 存 的 位数 和 其 表 示 范 围 。
int类 型 是 最 常 使 用 的 一 种 整 数 类 型 。 它 所 表 示 的 数 据范围 足 够 大 ,而 且适 合 于 32位 、 64位 处 理 器 。 但 对 于 大 型 计算 ,常 会 遇 到 很 大 的整 数 ,超 出 int类型 所 表 示 的 范 围 ,这 时 要使 用 long类 型 。
由 于 不 同 的 机 器 对 于 多 字 节 数 据 的 存 储 方 式 不 同 ,可 能是从 低 字 节 向高 字 节 存 储 ,也 可 能 是 从 高 字 节 向 低 字 节 存 储 ,这 样 ,在 分 析 网络 协 议 或 文 件格 式 时 , 为 了 解 决 不 同 机 器上 的 字 节 存 储 顺 序 问 题 ,用 byte类 型来 表 示 数 据 是合 适 的 。而 通 常 情 况 下 ,由 于 其 表 示 的 数 据 范 围 很 小 ,容 易 造成 溢 出 ,应 避 免使 用 。
short类 型 则 很 少 使 用 ,它 限 制 数 据 的 存 储 为 先 高 字 节 ,后低字 节 ,这 样 在 某些 机 器 中 会 出 错 。
三 、 整 型 变 量 的 定 义 ,如 :
byte b; //指定变量b为byte型
short s; //指定变量s为short型
int i; //指定变量i为int型
long l; //指定变量l为long型
§ 2.4 浮 点 型 (实 型 )数 据
一 、 实 型 常 量
与 C,C++相 同 ,Java的 实 常 数 有 两 种 表 示 形 式 :
① 十 进 制 数 形 式 ,由 数 字 和 小 数 点 组 成 ,且 必 须 有 小 数点,如 0.123, .123,123.,123.0
② 科 学 计 数 法 形 式 。 如 :123e3或 123E3,其 中 e或 E之 前 必 须有数 字 ,且 e或 E后面 的 指 数 必 须 为 整 数 。
实 常 数 在 机 器 中 占 64位 ,具 有 double型 的 值 。 对 于 float 型的值 ,则 要 在 数 字后 加 f或 F,如 12.3F,它 在 机 器 中 占 32位 , 且 表示 精 度 较 低 。
二 、 实 型 变 量
实 型 变 量 的 类 型 有 float和 double两 种 ,下 表 列 出 这 两 种 类型所 占 内 存 的 位数 和 其 表 示 范 围 。
数据类型 所占位数 数的范围
float 32 3.4e-038~3.4e+038
double 64 1.7e-308~1.7e+308
双 精 度 类 型 double比 单 精 度 类 型 float具 有 更 高 的 精 度 和更大 的 表 示 范 围 ,常 常 使 用 。
三 、 实 型 变 量 定 义 ,如
float f; //指 定 变 量 f为 float型
double d; //指 定 变 量 d为 double型
[注 ]与 C、 C++不 同 ,Java中 没 有 无 符 号 型 整 数 ,而 且 明 确 规定了 整 型 和 浮点 型 数 据 所 占 的 内 存 字 节 数 ,这 样 就 保 证 了安 全 性 、 鲁 棒 性和 平 台 无 关 性。
§ 2.5 字 符 型 数 据
一 、 字 符 常 量
字 符 常 量 是 用 单 引 号 括 起 来 的 一 个 字 符 ,如 ‘ a’ , ‘ A’。另 外 ,与 C、C++相 同 ,Java也 提 供 转 义 字 符 ,以 反 斜 杠 (\)开 头 ,将其 后 的 字 符转 变 为 另 外 的 含义 ,下 表 列 出 了 Java中 的 转 义 字符 。
与 C、 C++不 同 ,Java中 的 字 符 型 数 据 是 16位 无 符 号 型 数 据 ,它表 示 Unicode集,而 不 仅 仅 是 ASCII集 ,例 如 \u0061表 示 ISO拉 丁 码的 ‘ a’ 。
转义字符 描述
\ddd 1到3位8进制数据所表示的字符(ddd)
\uxxxx 1到4位16进制数所表示的字符(xxxx)
\' 单引号字符
\\ 反斜杠字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
二 、 字 符 型 变 量
字 符 型 变 量 的 类 型 为 char,它 在 机 器 中 占 16位 ,其 范 围 为 0~65 535。 字 符 型变 量 的 定 义 如 :
char c='a'; //指 定 变 量 c为 char型 ,且 赋 初 值 为 'a'
与 C、 C++不 同 ,Java中 的 字 符 型 数 据 不 能 用 作 整 数 , 因 为Java不提 供 无 符号 整 数 类 型 。 但 是 同 样 可 以 把 它 当 作 整 数 数 据来 操 作 。
例 如 :
int three=3;
char one='1';
char four=(char)(three+one);//four='4'
上 例 中 ,在 计 算 加 法 时 ,字 符 型 变 量 one被 转 化 为 整 数 , 进行相 加 ,最 后 把 结果 又 转 化 为 字 符 型 。
三 、 字 符 串 常 量
与 C、 C++相 同 ,Java的 字 符 串 常 量 是 用 双 引 号 ("")括起 来 的一 串 字 符 ,如"This is a string.\n"。 但 不 同 的 是 ,Java中 的 字 符 串 常 量 是 作 为String类 的 一 个 对 象 来处 理 的 ,而不 是 一 个 数 据 。 有 关 类 String,我 们 将 在 第 七 章 讲 述。
§ 2.6 布 尔 型 数 据
布 尔 型 数 据 只 有 两 个 值 ,true和 false,且 它 们 不 对 应 于 任何整 数 值 。 在 流 控制 中 常 用 到 它 。
布 尔 型 变 量 的 定 义 如 :
boolean b=true; //定 义 b为 布 尔 型 变 量 ,且 初 值 为 true
§ 2.7 举 例
例 2.1.下 例 中 用 到 了 前 面 提 到 的 数 据 类 型 ,并 通 过 屏 幕显 示 它 们 的 值 。
public class SimpleTypes{
public static void main( String args[] ){
byte b=0x55;
short s=0x55ff;
int i=1000000;
long l=0xfffL;
char c='c';
float f=0.23F;
double d=0.7E-3;
boolean bool=true;
System.out.println("b = "+b);
System.out.println("s = "+s);
System.out.println("i = "+i);
System.out.println("c = "+c);
System.out.println("f = "+f);
System.out.println("d = "+d);
System.out.println("bool = "+bool);
}
}
编译并运行该程序,输出结果为:
C:\>java SimpleTypes
b = 85
s = 22015
i = 1000000
l = 4095
c = c
f = 0.23
d = 0.0007
bool = true
§ 2.8 各 类 数 值 型 数 据 间 的 混 合 运 算
一 、 自 动 类 型 转 换
整 型 、 实 型 、 字 符 型 数 据 可 以 混 合 运 算 。 运 算 中 , 不同类 型 的 数 据 先转 化 为 同 一 类 型 ,然 后 进 行 运 算 。 转 换 从低 级 到 高 级 ,如 下 图:
转 换 规 则 为 :
① (byte或 short) op int→ int
② (byte或 short或 int) op long→ long
③ (byte或 short或 int或 long) op float→ float
④ (byte或 short或 int或 long或 float) op double→ double
⑤ char op int→ int
其 中 ,箭 头 左 边 表 示 参 与 运 算 的 数 据 类 型 ,op为 运 算 符 (如加、 减 、 乘 、除 等 ),右 边 表 示 转 换 成 的 进 行 运 算 的 数 据 类 型。
例2.2
public class Promotion{
public static void main( String args[ ] ){
byte b=10;
char c='a';
int i=90;
long l=555L;
float f=3.5f;
double d=1.234;
float f1=f*b;
// float * byte -> float
int i1=c+i;
// char + int -> int
long l1=l+i1;
// long + int ->ling
double d1=f1/i1-d;
// float / int ->float, float - double -> double}
}
二 、 强 制 类 型 转 换
高 级 数 据 要 转 换 成 低 级 数 据 ,需 用 到 强 制 类 型 转 换 ,如 :
int i;
byte b=(byte)i; //把 int型 变 量 i强 制 转 换 为 byte型
这 种 使 用 可 能 会 导 致 溢 出 或 精 度 的 下 降 ,最 好 不 要 使 用。
第 三 章 运 算 符 和 表 达式
运 算 符 指 明 对 操 作 数 所 进 行 的 运 算 。 按 操 作 数 的 数 目来分 ,可 以 有 一元 运 算 符 (如 ++、--),二 元 运 算 符 (如 +、 >)和 三元 运 算 符 (如?:),它 们 分 别 对 应 于一 个 、 两 个 和 三 个 操 作 数。 对 于 一 元 运 算 符 来 说 ,可 以 有 前缀 表 达 式 (如 ++i )和 后 缀表 达 式 (如 i++),对 于 二 元 运 算 符 来 说 则 采 用 中 缀 表 达 式 (如 a+b)。 按 照运 算 符 功 能 来 分 ,基 本 的 运 算 符 有 下 面 几 类 :
1.算 术 运 算 符 (+,-,*,/,%,++,--)
2.关 系 运 算 符 (>,<,>=,<=,==,!=)
3.布 尔 逻 辑 运 算 符 (!,&&,||)
4.位 运 算 符 (>>,<<,>>>,&,|,^,~ )
5.赋 值 运 算 符 (=,及 其 扩 展 赋 值 运 算 符 如 +=)
6.条 件 运 算 符 ( ?:)
7.其 它 (包 括 分 量 运 算 符 · ,下 标 运 算 符 [],实 例 运 算 符 instanc eof,内 存 分 配运 算 符 new,强 制 类 型 转 换 运 算 符 (类 型 ), 方 法调 用 运 算 符 () 等 )
本 章 中 我 们 主 要 讲 述 前 6类 运 算 符 。
§ 3.1 算 术 运 算 符
算 术 运 算 符 作 用 于 整 型 或 浮 点 型 数 据 ,完 成 算 术 运 算。
一 、 二 元 算 术 运 算 符 ,如 下 表 所 示
运算符 用法 描述
+ op1+op2 加
- op1-op2 减
* op1*op2 乘
/ op1/op2 除
% op1%op2 取模(求余)
Java对 加 运 算 符 进 行 了 扩 展 ,使 它 能 够 进 行 字 符 串 的连 接,如 "abc"+"de",得到 串 "abcde"。 我 们 将 在第 七 章 中 讲 解 。
与 C、 C++不 同 ,对 取 模 运 算 符 %来 说 ,其 操 作 数 可 以为浮点 数 , 如37.2%10=7.2。
二 、 一 元 算 术 运 算 符 ,如 下 表 所 示 :
运算符 用法 描述
+ +op 正值
- -op 负值
++ ++op,op++ 加1
-- --op,op-- 减1
i++与 ++i的 区 别
i++在 使 用 i之 后 ,使 i的 值 加 1,因 此 执 行 完 i++后 ,整 个 表达式的 值 为 i,而 i的 值变 为 i+1。
++i在 使 用 i之 前 ,使 i的 值 加 1,因 此 执 行 完 ++i后 ,整 个 表达式和 i的 值 均 为 i+1。
对 i--与 --i同 样 。
例 3.1.下 面 的 例 子 说 明 了 算 术 运 算 符 的 使 用
public class ArithmaticOp{
public static void main( String args[] ){
int a=5+4; //a=9
int b=a*2; //b=18
int c=b/4; //c=4
int d=b-c; //d=14
int e=-d; //e=-14
int f=e%4; //f=-2
double g=18.4;
double h=g%4; //h=2.4
int i=3;
int j=i++; //i=4,j=3
int k=++i; //i=5,k=5
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("c = "+c);
System.out.println("d = "+d);
System.out.println("e = "+e);
System.out.println("f = "+f);
System.out.println("g = "+g);
System.out.println("h = "+h);
System.out.println("i = "+i);
System.out.println("j = "+j);
System.out.println("k = "+k);
}
}
其结果为:
C:\>java ArithmaticOp
a = 9
b = 18
c = 4
d = 14
e = -14
f = -2
g = 18.4
h = 2.4
i = 5
j = 3
k = 5
§ 3.2 关 系 运 算 符
关 系 运 算 符 用 来 比 较 两 个 值 ,返 回 布 尔 类 型 的值true或 false。关 系 运 算 符 都 是 二 元 运 算 符 ,如 下 表 所 示 :
运算符 用法 返回true的情况
> op1>op2 op1大于op2
>= op1>=op2 op1大于或等于op2
< op1<op2 op1小于op2
<= op1<=op2 op1小于或等于op2
== op1==op2 op1与op2相等
!= op1!=op2 op1与op2不等
Java中 ,任 何 数 据 类 型 的 数 据 (包 括 基 本 类 型 和 组 合 类 型)都可 以 通 过 ==或!=来 比 较 是 否 相 等 (这 与 C、 C++不 同 )。
关 系 运 算 的 结 果 返 回 true或 false,而不是C、C++中 的 1或 0。
关 系 运 算 符 常 与 布 尔 逻 辑 运 算 符 一 起 使 用 ,作 为 流 控 制语句 的 判 断 条件 。 如
if( a>b && b==c)
§ 3.3 布 尔 逻 辑 运 算 符
布 尔 逻 辑 运 算 符 进 行 布 尔 逻 辑 运 算 ,如 下 表 所 示 :
op1 op2 op1&&op2 op1||op2 !op1
false false false false true
false true false true true
true false false true false
true true true true false }
·&&、‖ 为二元运算符,实现逻辑与、逻辑或。
·! 为一元运算符,实现逻辑非。
·对 于 布 尔 逻 辑 运 算 , 先 求 出 运 算 符 左 边 的 表 达 式 的 值 , 对 或 运 算 如 果 为 true, 则 整 个 表 达 式 的 结 果 为 true, 不 必对 运 算 符 右 边 的 表 达 式 再 进 行 运 算 ; 同 样 , 对 与 运 算 , 如果 左 边 表 达 式 的 值 为 false, 则 不 必 对 右 边的 表 达式 求 值 , 整个表 达 式 的 结果 为 false。
下面的例子说明了关系运算符和布尔逻辑运算符的使用。
public class RelationAndConditionOp{
public static void main( String args[] ){
int a=25,b=3;
boolean d=a<b; //d=false
System.out.println("a<b = "+d);
int e=3;
if(e!=0 && a/e>5)
System.out.println("a/e = "+a/e);
int f=0;
if(f!=0 && a/f>5)
System.out.println("a/f = "+a/f);
else
System.out.println("f = "+f);
}
}
其运行结果为:
C:\>java RelationAndConditionOp
a<b = false
a/e = 8
f = 0
注 意 :上 例 中 ,第 二 个 if语 句 在 运 行 时 不 会 发 生 除 0溢 出的错 误 ,因 为 e!=0为false,所 以 就 不 需 要 对 a/e进 行 运 算 。
§ 3.4 位 运 算 符
位 运 算 符 用 来 对 二 进 制 位 进 行 操 作 ,Java中 提 供 了 如 下表所 示 的 位 运 算符 :
位 运 算 符 中 ,除 ~ 以 外 ,其 余 均 为 二 元 运 算 符 。
操 作 数 只 能 为 整 型 和 字 符 型 数 据 。
3.4.1 补 码
Java使 用 补 码 来 表 示 二 进 制 数 ,在 补 码 表 示 中 ,最 高 位 为符号 位 ,正 数 的 符 号 位 为 0,负 数 为 1。 补 码 的 规 定 如 下 :
对 正 数 来 说 ,最 高 位 为 0,其 余 各 位 代 表 数 值 本 身 (以 二 进制表 示 ),如 +42的补 码 为 00101010。
对 负 数 而 言 ,把 该 数 绝 对 值 的 补 码 按 位 取 反 ,然 后 对 整个数 加 1,即 得 该 数的 补 码 。 如 -42的 补 码 为 11010110 (00101010 按位 取 反 11010101 +1=11010110 )
用 补 码 来 表 示 数 ,0的 补 码 是 唯 一 的 ,都 为 00000000。 (而 在原码 ,反 码 表 示中 ,+0和 -0的 表 示 是 不 唯 一 的 ,可 参 见 相 应 的书 籍 )。 而 且 可 以用 111111表 示 -1的 补 码 (这 也 是 补 码 与 原 码和 反 码 的 区 别 )。
3.4.2 按 位 取 反 运 算 符 ~
~ 是 一 元 运 算 法 ,对 数 据 的 每 个 二 进 制 位 取 反 ,即 把 1变为 0,把 0变 为 1。
例 如 :
0010101
~
1101010
注 意 ,~ 运 算 符 与 - 运 算 符 不 同 ,~ 21≠ -21。
3.4.3 按 位 与 运 算 符 &
参 与 运 算 的 两 个 值 ,如 果 两 个 相 应 位 都 为 1,则 该 位 的 结果为 1,否 则 为 0。即 :
0 & 0 = 0,0 &1 = 0,1 & 0 = 0,1 & 1 = 1
- 上一篇: 测控类赛题分析.pdf
- 下一篇: 论文研究-从UML设计模型到测试模型的研究.pdf