## 連載:面向對象葵花寶典:思想、技巧與實踐(7) - “對象”新解
有了“類”的清晰定義后,“對象”就比較容易理解了。
**對象就是一個具體的類,一個真實存在的類。**
前面我們提到面向對象是對現實世界的模擬,那么對象就是現實世界中存在的“物體”。
?
例如,“人”是一個類,我就是一個“人”的對象,你也是“人”的對象,奧巴馬也是“人”的對象。。。。。。
又比如:你去國美買冰箱,但國美肯定沒有一個單獨叫做“冰箱”的東西賣給你,而是具體的某臺海爾XX型號的冰箱、西門子XX型號的冰箱等。這里的“冰箱”就是一個類,而具體的“某臺海爾XX型號冰箱”、“某臺西門子XX型號冰箱”就是一個具體的對象。
?
但是,我們要繼續深究一下:有了類,為什么還會有對象?“類”和“對象”各自的作用是什么?
?
我們知道,在人類出現以前,世界上就有各種各樣的物體了,有恐龍、老虎、鱷魚、松樹、青草、石頭、空氣。。。。。等等,也就是說,真實存在的是對象,而“類”,是有了人類文明后,根據觀察分析,加以歸納總結而的出來的。
?
在軟件世界也是這樣的,真正存在于軟件運行過程中的是“對象”,而不是“類”,“類”只是在程序編寫中由程序員分析歸納出來的。這也是面向對象之所以叫做“面向對象”而不是“面向類”的一個原因吧。
?
雖然我們前面定義對象為“一個具體的類”,但這是否意味著必須是先有類后有對象呢?
要回答這個問題,我們首先要澄清幾個概念:現實對象、現實類、軟件對象、軟件類。
?
現實對象:你能看到的物體都可以稱為現實對象;
現實類:對現實對象的歸納總結;
軟件對象:軟件實際運行過程中存在的對象;
軟件類:軟件設計過程中歸納總結出來的類;
?
定義看起來很簡單,但它們的區別和聯系是什么呢?
如下圖示清晰的描述了它們之間的關系:
?
?
也就是說,首先是存在現實對象,然后人們根據自己的觀察角度和要求將現實對象抽象成現實類,然后軟件設計人員基于現實類模擬出軟件類,最后在程序中將軟件類實例化成軟件對象,最終的程序就是軟件對象的活動和交互。
?
那這樣是否意味著只有你能夠看見、能夠感知的對象才能抽象為類呢?
對于現實類和現實對象來說,可以說確實是這樣的;但對于軟件類和軟件對象并不完全是這樣的。
有一句名言叫做“電影來源于生活,但高于生活”,用在面向對象領域中就是“軟件類來源于現實類,但高于現實類”,為什么這么說呢?
?
首先,現實類在軟件類中必須有對應,但并不是完全一?一對應的,有的時候需要將現實類拆成幾個軟件類。
例如:比如說ATM機是現實世界真實存在的類,但在做軟件設計的時候,可能將ATM機拆分為“ATM認證”、“ATM打印”、“ATM取款”等幾個軟件類,這些軟件類互相配合,最后完成現實世界的ATM機器的功能。
?
其次:軟件類并不一定是現實存在的
例如:策略(Strategy)是一個人的概念,但并不是你可以看見或者感知到的;但在軟件領域中,這是一個很常見的類
?
也就是說,軟件類是對現實類的模擬,但并不簡單的等同,除了實現現實類相對應的功能外,我們還會創造出許多現實中并不存在的類,而這個創造過程,正是各種設計方法、設計模式、設計原則大顯身手的地方。
?
當你創造出各種各樣、豐富多彩的對象后,各種對象開始發揮自己的功能,并且相互作用,相互影響,軟件世界就開始運作起來,呈現出多姿多彩的功能和作用,整個軟件世界都處于你的控制之下,你甚至只需小小的修改幾行代碼,整個軟件就可能呈現完全不同的功能。
**你,就是軟件世界的上帝!**
一個簡單的對象實例如下:
~~~
<span style="font-size:14px;">package com.oo.demo;
public class Tester {
public static void main(String[] args) {
// 奧巴馬是一個“人”的對象
Person obama = new Person();
obama.setName("Obama");
obama.playBasketball();
System.out.println();
// 我也是一個“人”的對象
Person me = new Person();
me.setName("Yunhua Lee");
me.playFootball();
}
}</span>
~~~
- 前言
- (1) - 程序設計思想的發展
- (2) - 面向對象語言發展歷史
- (3) - 面向過程 vs 面向對象
- (4) - 面向對象是瑞士軍刀還是一把錘子?
- (5) - 面向對象迷思:面向對象導致性能下降?
- (6) - 不要說你懂“類”
- (7) - “對象”新解
- (8) - “接口” 詳解
- (9) - “抽象類” 詳解
- (10) - “抽象” 詳解
- (11) - “封裝” 詳解
- (12) - “繼承” 詳解
- (13) - “多態” 詳解
- (14) - 面向對象開發技術流程
- (15) - 需求詳解
- (16) - 需求分析終極目的
- (17) - 需求分析518方法
- (18) - 用例分析
- (19) - 功能點提取
- (20) - 用例圖的陷阱
- (21) - SSD
- (22) - 領域模型
- (23) - 領域建模三字經
- (24) - 設計模型
- (25) - 類模型
- (26) - 類模型三板斧
- (27) - 動態模型設計
- (28) - 設計原則:內聚&耦合
- (29) - 高內聚低耦合
- (30) - SRP原則
- (31) - OCP原則
- (32) - LSP原則
- (33) - ISP原則
- (34) - DIP原則
- (35) - NOP原則
- (36) - 設計原則如何用?
- (37) - 設計模式:瑞士軍刀 or 錘子?
- (38) - 設計模式之道
- (39) - 設計原則 vs 設計模式
- (40) - DECORATOR模式
- (完)- 書籍已經出版