﻿# 物件導向基礎：何謂類別(Class)？何謂物件(Object)？

每次有新人來面試，我都會問新人這個很基礎的程式開發問題，想聽看看來面試的人如何解釋這個每天朝夕相處的東西，但很難想像的是竟然有大部分的面試者都無法回答出讓我滿意的答案，不是支支吾吾的講不清楚，就是只能講出他們語法上的差別(錯誤觀念)，但卻無法清楚且具體的描述何謂類別、何謂物件。

以下是一些我之前在面試人員時聽到的解釋法：

**含糊帶過**

-   類別：就是 class 啊~  ( 這…我不是請你來翻譯的 )
-   物件：物件不就是可以 new 的那種嗎?  ( 對，但這樣回答不太好吧… )

**簡單帶過**

-   類別：定義程式的方法、屬性
-   物件：可執行的東西

**裝死**

-   類別：我不知道 ( 可能是沒自信說出來或真的不知道？ )   <= 最糟糕的答案!
-   物件：我不知道 ( 可能是沒自信說出來或真的不知道？ )   <= 最糟糕的答案!

我知道程式設計的領域有許多抽象概念，很多東西無法清楚的「直接」描述，所以要瞭解抽象概念就需要透過「比喻」來描述才比較能讓人瞭解，所以我建議那些講不出抽象概念的人要多學著用「比喻」的方式講解抽象概念，你能將抽象概念描述的越具體，相對的你對技術的掌握也越精準。

我個人所學到大部分的程式技能都是透過自修而來的，過程中經常沒人帶領，甚至找不到人可問，除了靠自身的興趣與熱情外，還需要靠大量的時間去消化、去理解、去求證，過程可說十分痛苦，但熱情如同**嗎啡**一般，確實可以減低許多自我成長時的痛苦感。

程式菜鳥在學習抽象概念時經常一知半解，若自己不求甚解的話久而久之真的會變成半弔子，變成只會寫 Code 的人(Coder)，而不是 Programming 的人(Programmer)，不但未來的路途變窄了，寫程式也會缺乏很多創意，沒有創意也就沒有熱情了。

★ **首先聲明**：

-   我不是什麼學者，講不出課本要的正確答案，想知道正確答案請查閱物件導向相關書籍。
-   如果你問 100 個人這個問題，可能會得到 200 個答案，所以你一定要有自己獨到、有自信、精闢的見解或描述方式。

**★ 我的個人見解：**

**類別(Class)** 與 **物件(Object)** 是個一體兩面的東西，以下我用幾個不同的方式說明這兩著的差別：

簡單解釋：

-   **類別**算是一個藍圖、一個範本、一個可參考的文件，他沒有 **實體** (**Instance**) 的概念，屬靜態的。
-   **物件**是一個看的到、摸的到的**實體**，屬於動態的，狀態會隨時改變，但架構與行為不會改變。

比喻一：建築物

-   類別：設計藍圖
-   物件：實際蓋好的房子
-   兩者關係：設計藍圖(**類別**)決定房子應該怎麼蓋，決定幾台電梯、幾間房間、走道如何設計。實際蓋好的房子(**物件**)是照著設計藍圖所蓋出來的房子，人只能照設計藍圖的設計使用這間房子。

比喻二：蓋世武功

-   類別：武林密笈
-   物件：修練武林密笈而成的武林高手
-   兩者關係：武林密笈(**類別**)記載許多各種攻擊與回應的方式，讓武林高手(**物件**)知道遭遇到什麼攻擊時要用什麼招式回應。
-   程式設計：每執行到我們用 new 運算子時，等同於將物件產生，也等同於成功得到武林密笈可以開始練功，或是在「建構子」的時候就已經賦予你基本功力。

基本上，**類別**只用來決定**物件形成**時的樣子，當物件形成時，**物件**就變成一個記憶體中的空間，記載著物件活動時暫存的資料與狀態，並且當有**類別**存在時有能力透過**方法(Method)**執行一些動作。

以下幾個基本的考題考考各位，看有沒有人可以回答出正確答案：

1.  請問「類別」可不可以包含「物件」？
2.  請問「物件」可不可以包含「類別」？
3.  請問「類別」可不可以包含「類別」？
4.  請問「物件」可不可以包含「物件」？
5.  請問「物件」可不可以當成資料傳遞？
6.  請問「類別」可不可以當成資料傳遞？
7.  在 .NET 的世界，請問「物件」可以用什麼型態存在或用什麼格式傳遞？（可任意回答一種以上）
8.  在 .NET 的世界，請問「類別」可以用什麼型態存在或用什麼格式傳遞？（可任意回答一種以上）
9.  在 .NET 的世界，程式在執行的時候，「類別」可不可以被動態修改？
10.  如果有兩台主機要互相傳遞資料，他們傳遞的是「類別」還是「物件」？
11.  請問「物件」是否包含「方法(Method)」？
12.  如果「物件」從 A 電腦傳遞到 B 電腦時，若該物件要執行「方法」還需不需要有「類別」存在？

這些問題每個人看的時候理解可能不同，甚至於可能覺得題目有問題(模稜兩可或題目不合邏輯或錯誤)，若覺得題目有問題在回答時需明確說明哪裡有問題。所以每個人的答案也許也很不一樣，你們就用自己的理解來回答即可，不用害怕答錯。

**2009/10/1 更新**

解答請見：[物件導向基礎：何謂類別(Class)？何謂物件(Object)？ \[解答\]](/post/2009/10/01/OOP-Basis-What-is-class-and-object-ANSWER)  
**看解答前建議先回答問題，物件的問題一定要自己動腦思考，否則學習效益不大。**
