|
本 講, 我 們 將 主 要 介 紹 Java 語 言 的 特 點(diǎn),Java 的 原 始 開 發(fā) 工 具JDK, 并 用 一 個 小 例 子 簡 單 介 紹 如 何 編 寫 使 用Java Applet。
一、Java 語 言 特 點(diǎn) 1 . 面 向 對 象 面 向 對 象 其 實(shí) 是 現(xiàn) 實(shí) 世 界 模 型 的 自 然 延 伸。 現(xiàn) 實(shí) 世 界 中 任 何 實(shí) 體 都 可 以 看 作 是 對 象。 對 象 之 間 通 過 消 息 相 互 作 用。 另 外, 現(xiàn) 實(shí) 世 界 中 任 何 實(shí) 體 都 可 歸 屬 于 某 類 事 物, 任 何 對 象 都 是 某 一 類 事 物 的 實(shí) 例。 如 果 說 傳 統(tǒng) 的 過 程 式 編 程 語 言 是 以 過 程 為 中 心 以 算 法 為 驅(qū) 動 的 話, 面 向 對 象 的 編 程 語 言 則 是 以 對 象 為 中 心 以 消 息 為 驅(qū) 動。 用 公 式 表 示, 過 程 式 編 程 語 言 為: 程 序= 算 法+ 數(shù) 據(jù); 面 向 對 象 編 程 語 言 為: 程 序= 對 象+ 消 息。 所 有 面 向 對 象 編 程 語 言 都 支 持 三 個 概 念: 封 裝、 多 態(tài) 性 和 繼 承,Java 也 不 例 外。 現(xiàn) 實(shí) 世 界 中 的 對 象 均 有 屬 性 和 行 為, 映 射 到 計 算 機(jī) 程 序 上, 屬 性 則 表 示 對 象 的 數(shù) 據(jù), 行 為 表 示 對 象 的 方 法( 其 作 用 是 處 理 數(shù) 據(jù) 或 同 外 界 交 互)。 所 謂 封 裝, 就 是 用 一 個 自 主 式 框 架 把 對 象 的 數(shù) 據(jù) 和 方 法 聯(lián) 在 一 起 形 成 一 個 整 體。 可 以 說, 對 象 是 支 持 封 裝 的 手 段, 是 封 裝 的 基 本 單 位。Java 語 言 的 封 裝 性 較 強(qiáng), 因 為Java 無 全 程 變 量, 無 主 函 數(shù), 在Java 中 絕 大 部 分 成 員 是 對 象, 只 有 簡 單 的 數(shù) 字 類 型、 字 符 類 型 和 布 爾 類 型 除 外。 而 對 于 這 些 類 型,Java 也 提 供 了 相 應(yīng) 的 對 象 類 型 以 便 與 其 他 對 象 交 互 操 作。 多 態(tài) 性 就 是 多 種 表 現(xiàn) 形 式, 具 體 來 說, 可 以 用“ 一 個 對 外 接 口, 多 個 內(nèi) 在 實(shí) 現(xiàn) 方 法” 表 示。 舉 一 個 例 子, 計 算 機(jī) 中 的 堆 棧 可 以 存 儲 各 種 格 式 的 數(shù) 據(jù), 包 括 整 型, 浮 點(diǎn) 或 字 符。 不 管 存 儲 的 是 何 種 數(shù) 據(jù), 堆 棧 的 算 法 實(shí) 現(xiàn) 是 一 樣 的。 針 對 不 同 的 數(shù) 據(jù) 類 型, 編 程 人 員 不 必 手 工 選 擇, 只 需 使 用 統(tǒng) 一 接 口 名, 系 統(tǒng) 可 自 動 選 擇。 運(yùn) 算 符 重 載(operator overload) 一 直 被 認(rèn) 為 是 一 種 優(yōu) 秀 的 多 態(tài) 機(jī) 制 體 現(xiàn), 但 由 于 考 慮 到 它 會 使 程 序 變 得 難 以 理 解, 所 以Java 最 后 還 是 把 它 取 消 了。 繼 承 是 指 一 個 對 象 直 接 使 用 另 一 對 象 的 屬 性 和 方 法。 事 實(shí) 上, 我 們 遇 到 的 很 多 實(shí) 體 都 有 繼 承 的 含 義。 例 如, 若 把 汽 車 看 成 一 個 實(shí) 體, 它 可 以 分 成 多 個 子 實(shí) 體, 如: 卡 車、 公 共 汽 車 等。 這 些 子 實(shí) 體 都 具 有 汽 車 的 特 性, 因 此, 汽 車 是 它 們 的“ 父 親”, 而 這 些 子 實(shí) 體 則 是 汽 車 的“ 孩 子”。Java 提 供 給 用 戶 一 系 列 類(class),Java 的 類 有 層 次 結(jié) 構(gòu), 子 類 可 以 繼 承 父 類 的 屬 性 和 方 法。 與 另 外 一 些 面 向 對 象 編 程 語 言 不 同,Java 只 支 持 單 一 繼 承。 2 . 平 臺 無 關(guān) 性 Java 是 平 臺 無 關(guān) 的 語 言 是 指 用Java 寫 的 應(yīng) 用 程 序 不 用 修 改 就 可 在 不 同 的 軟 硬 件 平 臺 上 運(yùn) 行。 平 臺 無 關(guān) 有 兩 種: 源 代 碼 級 和 目 標(biāo) 代 碼 級。C 和C++ 具 有 一 定 程 度 的 源 代 碼 級 平 臺 無 關(guān), 表 明 用C 或C++ 寫 的 應(yīng) 用 程 序 不 用 修 改 只 需 重 新 編 譯 就 可 以 在 不 同 平 臺 上 運(yùn) 行。 Java 主 要 靠Java 虛 擬 機(jī)(JVM) 在 目 標(biāo) 碼 級 實(shí) 現(xiàn) 平 臺 無 關(guān) 性。JVM 是 一 種 抽 象 機(jī) 器, 它 附 著 在 具 體 操 作 系 統(tǒng) 之 上, 本 身 具 有 一 套 虛 機(jī) 器 指 令, 并 有 自 己 的 棧、 寄 存 器 組 等。 但JVM 通 常 是 在 軟 件 上 而 不 是 在 硬 件 上 實(shí) 現(xiàn)。( 目 前,SUN 系 統(tǒng) 公 司 已 經(jīng) 設(shè) 計 實(shí) 現(xiàn) 了Java 芯 片, 主 要 使 用 在 網(wǎng) 絡(luò) 計 算 機(jī)NC 上。 另 外,Java 芯 片 的 出 現(xiàn) 也 會 使Java 更 容 易 嵌 入 到 家 用 電 器 中。)JVM 是Java 平 臺 無 關(guān) 的 基 礎(chǔ), 在JVM 上, 有 一 個Java 解 釋 器 用 來 解 釋Java 編 譯 器 編 譯 后 的 程 序。Java 編 程 人 員 在 編 寫 完 軟 件 后, 通 過Java 編 譯 器 將Java 源 程 序 編 譯 為JVM 的 字 節(jié) 代 碼。 任 何 一 臺 機(jī) 器 只 要 配 備 了Java 解 釋 器, 就 可 以 運(yùn) 行 這 個 程 序, 而 不 管 這 種 字 節(jié) 碼 是 在 何 種 平 臺 上 生 成 的( 過 程 如 圖1 所 示)。 另 外,Java 采 用 的 是 基 于IEEE 標(biāo) 準(zhǔn) 的 數(shù) 據(jù) 類 型。 通 過JVM 保 證 數(shù) 據(jù) 類 型 的 一 致 性, 也 確 保 了Java 的 平 臺 無 關(guān) 性。 Java 的 平 臺 無 關(guān) 性 具 有 深 遠(yuǎn) 意 義。 首 先, 它 使 得 編 程 人 員 所 夢 寐 以 求 的 事 情( 開 發(fā) 一 次 軟 件 在 任 意 平 臺 上 運(yùn) 行) 變 成 事 實(shí), 這 將 大 大 加 快 和 促 進(jìn) 軟 件 產(chǎn) 品 的 開 發(fā)。 其 次Java 的 平 臺 無 關(guān) 性 正 好 迎 合 了“ 網(wǎng) 絡(luò) 計 算 機(jī)” 思 想。 如 果 大 量 常 用 的 應(yīng) 用 軟 件( 如 字 處 理 軟 件 等) 都 用Java 重 新 編 寫, 并 且 放 在 某 個Internet 服 務(wù) 器 上, 那 么 具 有NC 的 用 戶 將 不 需 要 占 用 大 量 空 間 安 裝 軟 件, 他 們 只 需 要 一 個Java 解 釋 器, 每 當(dāng) 需 要 使 用 某 種 應(yīng) 用 軟 件 時, 下 載 該 軟 件 的 字 節(jié) 代 碼 即 可, 運(yùn) 行 結(jié) 果 也 可 以 發(fā) 回 服 務(wù) 器。 目 前, 已 有 數(shù) 家 公 司 開 始 使 用 這 種 新 型 的 計 算 模 式 構(gòu) 筑 自 己 的 企 業(yè) 信 息 系 統(tǒng)。 3 . 分 布 式 分 布 式 包 括 數(shù) 據(jù) 分 布 和 操 作 分 布。 數(shù) 據(jù) 分 布 是 指 數(shù) 據(jù) 可 以 分 散 在 網(wǎng) 絡(luò) 的 不 同 主 機(jī) 上, 操 作 分 布 是 指 把 一 個 計 算 分 散 在 不 同 主 機(jī) 上 處 理。 Java 支 持WWW 客 戶 機(jī)/ 服 務(wù) 器 計 算 模 式, 因 此, 它 支 持 這 兩 種 分 布 性。 對 于 前 者,Java 提 供 了 一 個 叫 作URL 的 對 象, 利 用 這 個 對 象, 你 可 以 打 開 并 訪 問 具 有 相 同URL 地 址 上 的 對 象, 訪 問 方 式 與 訪 問 本 地 文 件 系 統(tǒng) 相 同。 對 于 后 者,Java 的applet 小 程 序 可 以 從 服 務(wù) 器 下 載 到 客 戶 端, 即 部 分 計 算 在 客 戶 端 進(jìn) 行, 提 高 系 統(tǒng) 執(zhí) 行 效 率。 Java 提 供 了 一 整 套 網(wǎng) 絡(luò) 類 庫, 開 發(fā) 人 員 可 以 利 用 類 庫 進(jìn) 行 網(wǎng) 絡(luò) 程 序 設(shè) 計, 方 便 得 實(shí) 現(xiàn)Java 的 分 布 式 特 性。 4 . 可 靠 性 和 安 全 性 Java 最 初 設(shè) 計 目 的 是 應(yīng) 用 于 電 子 類 消 費(fèi) 產(chǎn) 品, 因 此 要 求 較 高 的 可 靠 性。Java 雖 然 源 于C++, 但 它 消 除 了 許 多C++ 不 可 靠 因 素, 可 以 防 止 許 多 編 程 錯 誤。 首 先,Java 是 強(qiáng) 類 型 的 語 言, 要 求 顯 式 的 方 法 聲 明, 這 保 證 了 編 譯 器 可 以 發(fā) 現(xiàn) 方 法 調(diào) 用 錯 誤, 保 證 程 序 更 加 可 靠; 其 次,Java 不 支 持 指 針, 這 杜 絕 了 內(nèi) 存 的 非 法 訪 問; 第 三,Java 的 自 動 單 元 收 集 防 止 了 內(nèi) 存 丟 失 等 動 態(tài) 內(nèi) 存 分 配 導(dǎo) 致 的 問 題; 第 四,Java 解 釋 器 運(yùn) 行 時 實(shí) 施 檢 查, 可 以 發(fā) 現(xiàn) 數(shù) 組 和 字 符 串 訪 問 的 越 界, 最 后,Java 提 供 了 異 常 處 理 機(jī) 制, 程 序 員 可 以 把 一 組 錯 誤 代 碼 放 在 一 個 地 方, 這 樣 可 以 簡 化 錯 誤 處 理 任 務(wù) 便 于 恢 復(fù)。 由 于Java 主 要 用 于 網(wǎng) 絡(luò) 應(yīng) 用 程 序 開 發(fā), 因 此 對 安 全 性 有 較 高 的 要 求。 如 果 沒 有 安 全 保 證, 用 戶 從 網(wǎng) 絡(luò) 下 載 程 序 執(zhí) 行 就 非 常 危 險。Java 通 過 自 己 的 安 全 機(jī) 制 防 止 了 病 毒 程 序 的 產(chǎn) 生 和 下 載 程 序 對 本 地 系 統(tǒng) 的 威 脅 破 壞。 當(dāng)Java 字 節(jié) 碼 進(jìn) 入 解 釋 器 時, 首 先 必 須 經(jīng) 過 字 節(jié) 碼 校 驗(yàn) 器 的 檢 查, 然 后,Java 解 釋 器 將 決 定 程 序 中 類 的 內(nèi) 存 布 局, 隨 后, 類 裝 載 器 負(fù) 責(zé) 把 來 自 網(wǎng) 絡(luò) 的 類 裝 載 到 單 獨(dú) 的 內(nèi) 存 區(qū) 域, 避 免 應(yīng) 用 程 序 之 間 相 互 干 擾 破 壞。 最 后, 客 戶 端 用 戶 還 可 以 限 制 從 網(wǎng) 絡(luò) 上 裝 載 的 類 只 能 訪 問 某 些 文 件 系 統(tǒng)。 上 述 幾 種 機(jī) 制 結(jié) 合 起 來, 使 得Java 成 為 安 全 的 編 程 語 言。 5 . 多 線 程 線 程 是 操 作 系 統(tǒng) 的 一 種 新 概 念, 它 又 被 稱 作 輕 量 進(jìn) 程, 是 比 傳 統(tǒng) 進(jìn) 程 更 小 的 可 并 發(fā) 執(zhí) 行 的 單 位。C 和C++ 采 用 單 線 程 體 系 結(jié) 構(gòu), 而Java 卻 提 供 了 多 線 程 支 持。 Java 在 兩 方 面 支 持 多 線 程。 一 方 面,Java 環(huán) 境 本 身 就 是 多 線 程 的。 若 干 個 系 統(tǒng) 線 程 運(yùn) 行 負(fù) 責(zé) 必 要 的 無 用 單 元 回 收, 系 統(tǒng) 維 護(hù) 等 系 統(tǒng) 級 操 作; 另 一 方 面,Java 語 言 內(nèi) 置 多 線 程 控 制, 可 以 大 大 簡 化 多 線 程 應(yīng) 用 程 序 開 發(fā)。Java 提 供 了 一 個 類Thread, 由 它 負(fù) 責(zé) 啟 動 運(yùn) 行, 終 止 線 程, 并 可 檢 查 線 程 狀 態(tài)。Java 的 線 程 還 包 括 一 組 同 步 原 語。 這 些 原 語 負(fù) 責(zé) 對 線 程 實(shí) 行 并 發(fā) 控 制。 利 用Java 的 多 線 程 編 程 接 口, 開 發(fā) 人 員 可 以 方 便 得 寫 出 支 持 多 線 程 的 應(yīng) 用 程 序, 提 高 程 序 執(zhí) 行 效 率。 必 須 注 意 地 是,Java 的 多 線 程 支 持 在 一 定 程 度 上 受 運(yùn) 行 時 支 持 平 臺 的 限 制。 例 如, 如 果 操 作 系 統(tǒng) 本 身 不 支 持 多 線 程,Java 的 多 線 程 特 性 可 能 就 表 現(xiàn) 不 出 來。 二、 Java 小 程 序 和 應(yīng) 用 程 序 由 于WWW 使 小 程 序 的 發(fā) 布 十 分 便 利, 因 此 小 程 序 更 適 合 作 為Internet 上 的 應(yīng) 用 程 序。 相 反, 非 網(wǎng) 絡(luò) 系 統(tǒng) 和 內(nèi) 存 較 小 的 系 統(tǒng) 更 適 合 用Java 應(yīng) 用 程 序 而 較 少 用Java 小 程 序 實(shí) 現(xiàn)。 另 外,Java 應(yīng) 用 程 序 也 很 容 易 以Internet 為 基 礎(chǔ) 環(huán) 境, 事 實(shí) 上 有 些 優(yōu) 秀 的Java 應(yīng) 用 程 序 正 是 如 此。 例 如,HotJava( 用Java 語 言 編 寫 的WWW 瀏 覽 器)。 下 表 顯 示 出 小 程 序 與 應(yīng) 用 程 序 之 間 的 差 別 。 附 表 小 程 序 與 應(yīng) 用 程 序 的 差 別 應(yīng) 用 程 序 小 程 序 三、 Java 開 發(fā) 工 具JDK JDK 由 一 個 標(biāo) 準(zhǔn) 類 庫 和 一 組 建 立, 測 試 及 建 立 文 檔 的Java 實(shí) 用 程 序 組 成。 其 核 心Java API 是 一 些 預(yù) 定 義 的 類 庫, 開 發(fā) 人 員 需 要 用 這 些 類 來 訪 問Java 語 言 的 功 能。Java API 包 括 一 些 重 要 的 語 言 結(jié) 構(gòu) 以 及 基 本 圖 形, 網(wǎng) 絡(luò) 和 文 件I/O。 一 般 來 說,Java API 的 非I/O 部 分 對 于 運(yùn) 行Java 的 所 有 平 臺 是 相 同 的, 而I/O 部 分 則 僅 在 通 用Java 環(huán) 境 中 實(shí) 現(xiàn)。 作 為JDK 實(shí) 用 程 序, 工 具 庫 中 有 七 種 主 要 程 序。 Javac: Java 編 譯 器, 將Java 源 代 碼 轉(zhuǎn) 換 成 字 節(jié) 碼。 Java: Java 解 釋 器, 直 接 從 類 文 件 執(zhí) 行Java 應(yīng) 用 程 序 字 節(jié) 代 碼。 appletviewer: 小 程 序 瀏 覽 器, 一 種 執(zhí) 行HTML 文 件 上 的Java 小 程 序 的Java 瀏 覽 器。 Javadoc: 根 據(jù)Java 源 碼 及 說 明 語 句 生 成HTML 文 檔。 Jdb:Java 調(diào) 試 器, 可 以 逐 行 執(zhí) 行 程 序, 設(shè) 置 斷 點(diǎn) 和 檢 查 變 量。 Javah: 產(chǎn) 生 可 以 調(diào) 用Java 過 程 的C 過 程, 或 建 立 能 被Java 程 序 調(diào) 用 的C 過 程 的 頭 文 件。 Javap:Java 反 匯 編 器, 顯 示 編 譯 類 文 件 中 的 可 訪 問 功 能 和 數(shù) 據(jù), 同 時 顯 示 字 節(jié) 代 碼 含 義。 四、 用JDK 建 立 小 程 序 importjava.awt.*; JavacOutputHello.java 如 果 程 序 被 編 譯 器 接 受, 則 不 顯 示 信 息, 并 生 成OutputHello.class 文 件。 如 果 有 錯 誤 信 息, 則 必 須 修 改 源 代 碼 重 新 編 譯, 直 到 通 過 為 止。 在 運(yùn) 行 小 程 序 前, 我 們 還 必 須 生 成 一 個HTML 文 檔 來 放 置 它。HTML 文 檔 中 有 多 種 標(biāo) 識, 與Java Applet 有 關(guān) 的 標(biāo) 識 為:
< html > < head >< /head > 將 文 件 存 為OutputHello.html。 運(yùn) 行 小 程 序 可 以 使 用appletviewer 或 任 何 一 種 支 持Java Applet 的 瀏 覽 器 如Netscape, 如 果 用appletviewer 則 輸 入 如 下 語 句:appletviewerOutputHello.html 運(yùn) 行 后 在appletviewer 窗 口 輸 出Hello world。 自 己 編 寫applet 對 于 一 般 用 戶 來 說 可 能 是 件 困 難 的 事。 因 此, 大 多 數(shù) 人 可 以 上 網(wǎng) 下 載 一 些 其 他 人 編 寫 的 現(xiàn) 有 小 程 序, 嵌 入 到 自 己 的 網(wǎng) 頁 中。 嵌 入 小 程 序 的 過 程 同 上 面 的 例 子 一 樣, 即 在 主 頁 中 合 適 的 位 置 加 入 標(biāo) 識, 并 輸 入 文 件 名、 長 和 寬。 如 果 小 程 序 有 參 數(shù), 則 再 加 入 屬 性 即 可。 本 講 主 要 介 紹Java 語 言 的 特 性, 簡 單 介 紹 了 兩 種 類 型 的Java 程 序: 小 程 序 和 應(yīng) 用 程 序, 開 發(fā) 工 具JDK, 并 在 最 后 用 一 個 例 子 說 明 如 何 用JDK 工 具 開 發(fā) 使 用Java Applet。 此文轉(zhuǎn)自www., |
|
|