关 于JAVA 的 可 移 植 性

1. JAVA 作 为 一 种 编 程 语 言: 源 代 码 可 移 植 性

       作 为 一 种 编 程 语 言,JAVA 提 供 了 一 种 最 简 单 同 时 也 是 人 们 最 熟 悉 的 可 移 植 性-- 源 代 码 移 植。 这 意 味 着 任 意 一 个JAVA 程 序, 不 论 它 运 行 在 何 种CPU、 操 作 系 统 或JAVA 编 译 器 上, 都 将 产 生 同 样 的 结 果。 这 并 不 是 一 个 新 的 概 念。 人 们 使 用C、C++ 也 可 以 产 生 同 样 的 效 果。 但 是 使 用C 或C++ 编 程 人 们 可 以 有 太 多 的 选 择, 在 许 多 细 节 上 它 都 没 有 严 格 定 义, 如: 未 初 始 化 变 量 的 值、 对 已 释 放 的 内 存 的 存 取、 浮 点 运 算 的 尾 数 值 等 等。 所 以 除 非 你 一 开 始 就 严 格 按 照 系 统 无 关 的 概 念 来 进 行 设 计, 否 则 这 种 可 移 植 性 只 能 是 一 种 理 论 上 的 设 想 而 不 能 形 成 实 践。 总 之, 尽 管C 和C++ 有 严 密 的 语 法 定 义, 它 们 的 语 意(symantics) 定 义 还 不 是 标 准 的。 这 种 语 意 上 的 不 统 一 使 得 同 一 段 程 序 在 不 同 的 系 统 环 境 下 会 产 生 不 同 的 结 果。 有 时 即 使 系 统 情 况 完 全 相 同 而 仅 仅 由 于 编 译 器 的 设 置 不 同 也 会 产 生 令 人 意 想 不 到 的 结 果。 而JAVA 就 不 同 了。 它 定 义 了 严 密 的 语 意 结 构, 而 使 编 译 器 不 承 担 这 方 面 的 工 作。 另 外,JAVA 对 程 序 的 行 为 的 定 义 也 比C 和C++ 严 格, 如: 它 提 供 了 内 存 自 动 回 收 功 能(Garbage Collection), 使 程 序 不 能 访 问 越 界 内 存; 它 对 未 初 始 化 的 变 量 提 供 确 定 值 等 等。 它 的 这 些 特 性 能 够 减 小 在 不 同 平 台 上 运 行 的JAVA 程 序 之 间 的 差 异, 也 使 得JAVA 具 有 即 使 没 有JAVA 虚 拟 机 的 存 在 的 情 况 下 比C 和C++ 更 好 的 平 台 无 关 性。 然 而, 这 些 特 点 也 有 它 不 利 的 一 面。JAVA 设 想 运 行 于 具 有32 位 字 节 长 度 且 每 字 节 为8 位 的 计 算 机 上, 这 就 使 得 那 些8 位 字 长 的 计 算 机 和 一 些 巨 型 机 不 能 有 效 的 运 行JAVA 程 序。 在 这 样 的 平 台 上 就 只 能 运 行 那 些 可 移 植 的C 和C++ 程 序 了。

2. JAVA 作 为 一 个 虚 拟 机:CPU 可 移 植 性

       大 多 数 编 译 器 产 生 的 目 标 代 码 只 能 运 行 在 一 种CPU 上( 如Intel 的x86 系 列), 即 使 那 些 能 支 持 多 种CPU 的 编 译 器 也 不 能 同 时 产 生 适 合 多 种CPU 的 目 标 代 码。 如 果 你 需 要 在 三 种CPU( 如x86、SPARC 和MIPS) 上 运 行 同 一 程 序, 就 必 须 编 译 三 次。

       但JAVA 编 译 器 就 不 同 了。JAVA 编 译 器 产 生 的 目 标 代 码(J-Code) 是 针 对 一 种 并 不 存 在 的CPU--JAVA 虚 拟 机(JAVA Virtual Machine), 而 不 是 某 一 实 际 的CPU。JAVA 虚 拟 机 能 掩 盖 不 同CPU 之 间 的 差 别, 使J-Code 能 运 行 于 任 何 具 有JAVA 虚 拟 机 的 机 器 上。

       虚 拟 机 的 概 念 并 不 是JAVA 所 特 有 的: 加 州 大 学 几 年 前 就 提 出 了PASCAL 虚 拟 机 的 概 念; 广 泛 用 于Unix 服 务 器 的Perl 脚 本 也 是 产 生 与 机 器 无 关 的 中 间 代 码 用 于 执 行。 但 针 对 Internet 应 用 而 设 计 的JAVA 虚 拟 机 的 特 别 之 处 在 于 它 能 产 生 安 全 的 不 受 病 毒 威 胁 的 目 标 代 码。 正 是 由 于Internet 对 安 全 特 性 的 特 别 要 求 才 使 得JVM 能 够 迅 速 被 人 们 接 受。 当 今 主 流 的 操 作 系 统 如OS/2、MacOS、Windows95/NT 都 已 经 或 很 快 提 供 对J-Code 的 支 持。

       作 为 一 种 虚 拟 的CPU,JAVA 虚 拟 机 对 于 源 代 码(Source Code) 来 说 是 独 立 的。 我 们 不 仅 可 以 用JAVA 语 言 来 生 成J-Code, 也 可 以 用Ada95 来 生 成。 事 实 上, 已 经 有 了 针 对 若 干 种 源 代 码 的J-Code 编 译 器, 包 括Basic、Lisp 和Forth。 源 代 码 一 经 转 换 成J-Code 以 后, JAVA 虚 拟 机 就 能 够 执 行 而 不 区 分 它 是 由 哪 种 源 代 码 生 成 的。 这 样 做 的 结 果 就 是CPU 可 移 植 性。

       将 源 程 序 编 译 为J-Code 的 好 处 在 于 可 运 行 于 各 种 机 器 上, 而 缺 点 是 它 不 如 本 机 代 码 运 行 的 速 度 快。

3. JAVA 作 为 一 种 虚 拟 的 操 作 系 统(OS) 和 图 形 用 户 界 面(GUI): 操 作 系 统 可 移 植 性

       即 使 经 过 重 新 编 译, 大 多 数 的 用C 和C++ 编 写 的Windows 程 序 也 不 能 在Unix 或Macintosh 系 统 上 运 行。 这 是 为 什 么 呢 ? 因 为 程 序 员 在 编 写Windows 程 序 时 使 用 了 大 量 的WindowsAPI 和 中 断 调 用, 而Windows 程 序 对 系 统 功 能 的 调 用 与Unix 和Macintosh 程 序 有 很 大 的 差 别, 所 以 除 非 将 全 套Windows API 移 植 到 其 它 操 作 系 统 上, 否 则 重 编 译 的 程 序 仍 不 能 运 行。

       JAVA 采 用 了 提 供 一 套 与 平 台 无 关 的 库 函 数( 包 括AWT、UTIL、LANG 等 等) 的 方 法 来 解 决 这 个 问 题。 就 象JVM 提 供 了 一 个 虚 拟 的CPU 一 样,JAVA 库 函 数 提 供 了 一 个 虚 拟 的GUI 环 境。JAVA 程 序 仅 对JAVA 库 函 数 提 出 调 用, 而 库 函 数 对 操 作 系 统 功 能 的 调 用 由 各 不 同 的 虚 拟 机 来 完 成。JAVA 也 在 它 的OS/GUI 库 中 使 用 了 一 种“ 罕 见 名 称 符”(least-commom-denominator) 来 提 供 对 某 种 特 定 操 作 系 统 的 功 能 调 用, 即 此 功 能 只 在 特 定 环 境 下 生 效 而 在 其 它 操 作 系 统 下 则 被 忽 略。 这 样 做 的 好 处 在 于 可 以 针 对 某 操 作 系 统 生 成 拥 有 人 们 熟 悉 的 界 面 的 应 用 程 序 而 同 时 此 程 序 又 能 在 其 它 系 统 下 运 行。 缺 点 则 是 系 统 中 的 某 些 功 能 调 用 有 很 强 的 依 赖 性 因 而 在JAVA 的 虚 拟OS/API 中 难 以 实 现。 遇 到 这 种 情 况, 程 序 员 就 只 能 写 不 可 移 植 的 程 序 了。

       总 之,JAVA 在 可 移 植 性 方 面 的 特 点 使 它 在Internet 上 具 有 广 泛 的 应 用 前 景。 同 时 它 本 身 具 有 的 防 病 毒 的 能 力 也 使 它 在 需 要 高 可 靠 性 的 应 用 中 占 有 一 席 之 地

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
第 一 章   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认 为 JavaInternet和WWW开辟 了 一 个崭 新 时 代 . 环 球 信 息 网 WWW 创 始 人 Berners-Lee说 : "计 算 机 事 业 发展 下 一 个 浪 潮 就是 Java,并 且 将 很 快 会 发 生 "。看 来 ,使 用 Java已 成 大 势 所 趋 ! MicroSoft 和 IBM 两 大 公 司 都 计 划 在 Internet上 销 售 用 Java 编写 软 件 。 Apple、 HP、 IBM、 MicroSoft、 Novell、 SGI、 SCO、 Tandem 等 公 司均计 划 将 Java并入 各 自 开 发 操 作系 统 ,而 负 责 开 发 并 推 广 Java技 术 SunSoft公司 (这 是 SUN下 属 一 个 子 公 司 ), 将 通 过 颁发 许 办 法 来 允 许 各 家 公 司 把Java虚 拟 机 和 JavaApplets类库 嵌 入 他 们 开 发 操 作 系 统 ,这 样 各 类 开 发 人 员 就 能更 容易 地 选 择 多种 平 台 来 使 用 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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

wxyxl

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值