在 前 面 幾 章 中 ,我 們 對 Java的 簡 單 數 據 類 型 、 數 組 、 運 算 符 和 表 達 式 以 及 流 控 制 方 法
作 了 詳 細 的 介 紹 。 從 現 在 開 始 ,我 們 要 深 入 到 面 向 對 象 的 編 程 技 術 ,深 入 到 Java最 吸 引 人 的
地 方 。 本 章 中 ,我 們 首 先 講 述 面 向 對 象 程 序 設 計 的 基 本 概 念 及 特 點 ,然 後 討 論 Java中 的 類 、
對 象 、 包 和 接 口 ,最 後 進 行 小 結 ,給 出 一 個 完 整 的 Java文 件 的 格 式 。
§ 6.1 面 向 對 象 的 程 序 設 計
面 向 過 程 的 程 序 設 計 方 法 從 解 決 問 題 的 每 一 個 步 驟 入 手 ,它 適 合 於 解 決 比 較 小 的 簡 單
問 題 。 C語 言 采 用 面 向 過 程 的 程 序 設 計 模 型 ,但 是 由 於 C本 身 幾 乎 沒 有 支 持 代 碼 重 用 的 語 言
結 構 ,並 且 缺 乏 統 一 的 接 口 ,使 得 當 程 序 的 規 模 達 到 一 定 程 度 時 ,程 序 員 很 難 控 制 其 復 雜 性
。
面 向 對 象 的 程 序 設 計 方 法 則 按 照 現 實 世 界 的 特 點 來 管 理 復 雜 的 事 物 ,把 它 們 抽 象 為 對
象 ,具 有 自 己 的 狀 態 和 行 為 ,通 過 對 消 息 的 反 應 來 完 成 一 定 的 任 務 。
6.1.1 對 象 、 類 和 消 息
一 個 對 象 就 是 變 量 和 相 關 的 方 法 的 集 合 ,其 中 變 量 表 明 對 象 的 狀 態 ,方 法 表 明 對 象 所
具 有 的 行 為 ,下 圖 表 示 了 一 個 對 象 的 特 征 :
從 圖 中 可 以 看 出 ,一 個 對 象 的 變 量 構 成 這 個 對 象 的 核 心 ,包 圍 在 它 外 面 的 方 法 使 這 個
對 象 和 其 它 對 象 分 離 開 來 。 例 如 :我 們 可 以 把 汽 車 抽 象 為 一 個 對 象 ,用 變 量 來 表 示 它 當 前 的
狀 態 ,如 速 度 、 油 量 、 型 號 、 所 處 的 位 置 等 ,它 的 行 為 則 可 以 有 加 速 、 剎 車 、 換 擋 等 。 我
們 操 縱 汽 車 時 ,不 用 去 考 慮 汽 車 內 部 各 個 零 件 如 何 運 作 的 細 節 ,而 只 需 根 據 汽 車 可 能 的 行
為 使 用 相 應 的 方 法 即 可 。 實 際 上 ,面 向 對 象 的 程 序 設 計 實 現 了 對 對 象 的 封 裝 ,使 我 們 不 必
關 心 對 象 的 行 為 是 如 何 實 現 的 這 樣 一 些 細 節 。 通 過 對 對 象 的 封 裝 ,實 現 了 模 塊 化 和 信 息 隱
藏 ,有 利 於 程 序 的 可 移 植 性 和 安 全 性 ,同 時 也 利 於 對 復 雜 對 象 的 管 理 。
對 象 之 間 必 須 要 進 行 交 互 來 實 現 復 雜 的 行 為 。 例 如 ,要 使 汽 車 加 速 ,必 須 發 給 它 一 個
消 息 ,告 訴 它 進 行 何 種 動 作 (這 裡 是 加 速 )以 及 實 現 這 種 動 作 所 需 的 參 數 (這 裡 是 需 要 達 到 的
速 度 等 )。 下 圖 表 示 了 對 象 A與 對 象 B間 的 消 息 傳 遞 過 程 。
從 圖 中 可 以 看 出 ,一 個 消 息 包 含 三 個 方 面 的 內 容 :
● 消 息 的 接 收 者
● 接 收 對 象 應 采 用 的 方 法
● 方 法 所 需 要 的 參 數 。
同 時 ,接 收 消 息 的 對 象 在 執 行 相 應 的 方 法 後 ,可 能 會 給 發 送 消 息 的 對 象 返 回 一 些 信 息
(如 上 例 中 ,汽 車 的 儀 表 上 會 出 現 已 經 達 到 的 速 度 等 )。
由 於 任 何 一 個 對 象 的 所 有 行 為 都 可 以 用 方 法 來 描 述 ,通 過 消 息 機 制 就 可 以 完 全 實 現 對
象 之 間 的 交 互 ,同 時 ,處 於 不 同 處 理 過 程 甚 至 不 同 主 機 的 對 象 間 也 可 以 通 過 消 息 實 現 交 互
。
上 面 所 說 的 對 象 是 一 個 具 體 的 事 物 ,例 如 每 輛 汽 車 都 是 一 個 不 同 的 對 象 。 但 是 多 個 對
象 常 常 具 有 一 些 共 性 ,如 所 有 的 汽 車 都 有 輪 子 、 方 向 盤 、 常 具 有 一 些 共 性 ,如 所 有 的 汽 車
都 有 輪 子 、 方 向 盤 、 剎 車 裝 置 等 。 於 是 我 們 抽 象 出 一 類 對 象 的 共 性 ,這 就 是 類 。 類 中 定 義
一 類 對 象 共 有 的 變 量 和 方 法 。 把 一 個 類 實 例 化 即 生 成 該 類 的 一 個 對 象 。 比 如 我 們 可 以 定
義 一 個 汽 車 類 來 描 述 所 有 汽 車 的 共 性 。 通 過 類 的 定 義 人 們 可 以 實 現 代 碼 的 復 用 。 我 們 不
用 去 描 述 每 一 個 對 象 (如 某 輛 汽 車 ),而 是 通 過 創 建 類 (如 汽 車 類 )的 一 個 實 例 來 創 建 該 類 的 一
個 對 象 ,這 大 大 減 化 了 軟 件 的 設 計 。
6.1.2 繼 承
通 過 對 象 、 類 ,我 們 實 現 了 封 裝 ,通 過 子 類 我 們 可 以 實 現 繼 承 。
對 於 上 例 來 說 ,公 共 汽 車 、 出 租 車 、 貨 車 等 都 是 汽 車 ,但 它 們 是 不 同 的 汽 車 ,除 了 具 有
汽 車 的 共 性 外 ,它 們 還 具 有 自 己 的 特 點 (如 不 同 的 操 作 方 法 ,不 同 的 用 途 等 )。 這 時 我 們 可 以
把 它 們 作 為 汽 車 的 子 類 來 實 現 ,它 們 繼 承 父 類 (汽 車 )的 所 有 狀 態 和 行 為 ,同 時 增 加 自 己 的 狀
態 和 行 為 。 通 過 父 類 和 子 類 ,我 們 實 現 了 類 的 的 層 次 ,可 以 從 最 一 般 的 類 開 始 ,逐 步 特 殊 化
,定 義 一 系 列 的 子 類 。 同 時 ,通 過 繼 承 也 實 現 了 代 碼 的 復 用 , 使 程 序 的 復 雜 性 線 性 地 增 長 ,而
不 是 呈 幾 何 級 數 增 長 。
在 C++中 支 持 多 重 繼 承 ,即 一 個 類 可 以 繼 承 多 個 父 類 ,這 使 得 對 象 的 實 現 變 得 非 常 復 雜
且 不 可 預 料 (設 想 多 個 父 類 擁 有 某 些 相 同 的 變 量 和 方 法 )。 Java則 只 支 持 單 一 繼 承 ,大 大 降 低
了 復 雜 度 。 在 Java中 通 過 接 口 可 以 實 現 多 重 繼 承 ,但 接 口 的 概 念 更 簡 單 ,使 用 更 方 便 ,而 且 不
僅 僅 限 於 繼 承 ,它 使 多 個 不 相 關 的 類 可 以 具 有 相 同 的 方 法 。
6.1.3 多 態
Java通 過 方 法 重 寫 和 方 法 重 載 來 實 現 多 態 。
通 過 方 法 重 寫 ,一 個 類 中 可 以 有 多 個 具 有 相 同 名 字 的 方 法 , 由 傳 遞 給 它 們 的 不 同 個 數
和 類 型 的 參 數 來 決 定 使 用 哪 種 方 法 ,這 就 是 多 態 。 例 如 ,對 於 一 個 作 圖 的 類 ,它 有 一 個
draw()方 法 用 來 畫 圖 或 輸 出 文 字 ,我 們 可 以 傳 遞 給 它 一 個 字 符 串 、 一 個 矩 形 、 一 個 圓 形 ,甚
至 還 可 以 再 指 定 作 圖 的 初 始 位 置 、 圖 形 的 顏 色 等 ,對 於 每 一 種 實 現 ,只 需 實 現 一 個 新 的
draw()方 法 即 可 ,而 不 需 要 新 起 一 個 名 字 , 這 樣 大 大 簡 化 了 方 法 的 實 現 和 調 用 ,程 序 員 和 用 戶
都 不 需 要 記 住 很 多 的 方 法 名 ,只 需 要 傳 入 相 應 的 參 數 即 可 。
通 過 方 法 重 載 ,子 類 可 以 重 新 實 現 父 類 的 某 些 方 法 ,使 其 具 有 自 己 的 特 征 。 例 如 對 於
汽 車 類 的 加 速 方 法 ,其 子 類 (如 賽 車 )中 可 能 增 加 了 一 些 新 的 部 件 來 改 善 提 高 加 速 性 能 ,這 時
可 以 在 賽 車 類 中 重 載 父 類 的 加 速 方 法 。 重 載 隱 藏 了 父 類 的 方 法 ,使 子 類 擁 有 自 己 具 體 實 現
,更 進 一 步 表 明 了 與 父 類 相 比 ,子 類 所 具 有 的 特 殊 性 。
本 節 中 ,我 們 對 面 向 對 象 程 序 設 計 的 一 些 基 本 內 容 作 了 講 解 ,下 面 我 們 就 分 別 講 述
Java是 如 何 實 現 這 些 內 容 的 。
§ 6.2 類
類 是 組 成 Java程 序 的 基 本 要 素 。 它 封 裝 了 一 類 對 象 的 狀 態 和 方 法 ,是 這 一 類 對 象 的 原
型 。 在 前 幾 章 的 例 子 中 ,我 們 已 經 定 義 了 一 些 簡 單 的 類 ,如 Hellowo rldApp類 。
public class HelloWorldApp{
public static void main( String args[ ] ){
System.out.println("Hello World !");
}
}
可以看出,一個類的實現包含兩部分的內容:
classDeclaration {
classBody
}
下 面 我 們 分 別 對 每 一 部 分 詳 細 講 述 。
6.2.1 類 聲 明
一 個 最 簡 單 的 類 聲 明 如 下 :
class className {
……
}
例如:
class Point{
……
}
同 時 ,在 類 聲 明 中 還 可 以 包 含 類 的 父 類 ,類 所 實 現 的 接 口 以 及 修 飾 符 public、 abstract或
final。 我 們 將 分 別 在 後 面 的 幾 節 中 介 紹 。
6.2.2 類 體
類 體 中 定 義 了 該 類 所 有 的 變 量 和 該 類 所 支 持 的 方 法 。 通 常 變 量 在 方 法 前 定 義 (並 不 一
定 要 求 ),如 下 所 示 :
class className {
memberVariableDeclarations
methodDeclarations
}
下 例 定 義 了 一 個 Point類 ,並 且 聲 明 了 它 的 兩 個 變 量 x、 y坐 標 ,同 時 實 現 init()方 法 對 x、 y賦
初 值 。