“上帝創(chuàng)造了人,并給了人思想焙糟,而思想是決定萬物的根本尺度” ——引
面向?qū)ο蟮母拍?/h1>
面向?qū)ο笾该嫦蚩陀^規(guī)律之間的關系题翻,人類平常的思維方式就是面向?qū)ο蟮呐旁祝匀唤绲氖挛锱c事物之間是對象與對象之間的關系褐鸥。我們要解決一個問題時线脚,這個問題就變成了對象赐稽,而這個過程就變成了面向?qū)ο蟆?/p>
一切都是對象
(1) 所有東西都是對象叫榕。可將對象想象成一種新型變量姊舵;它保存著數(shù)據(jù)晰绎,但可要求它對自身進行操作。理論上講括丁,可從要解決的問題身上提出所有概念性的組件荞下,然后在程序中將其表達為一個對象。
(2) 程序是一大堆對象的組合史飞;通過消息傳遞尖昏,各對象知道自己 該做些什么。為了向?qū)ο蟀l(fā)出請求构资,需向那個對象“發(fā)送一條消息”抽诉。更具體地講,可將消息想象為一個調(diào)用請求吐绵,它調(diào)用的是從屬于目標對象的一個子例程或函數(shù)迹淌。
(3) 每個對象都有自己的存儲空間,可容納其他對象己单“η裕或者說,通過封裝現(xiàn)有對象纹笼,可制作出新型對象纹份。所以,盡管對象的概念非常簡單廷痘,但在程序中卻可達到任意高的復雜程度蔓涧。
(4) 每個對象都有一種類型。根據(jù)語法牍疏,每個對象都是某個“類”的一個“實例”蠢笋。其中,“類”( Class )是“類型”( Type )的同義詞鳞陨。一個類最重要的特征就是“能將什么消息發(fā)給它昨寞?”瞻惋。
(5) 同一類 所有對象都能接收相同的消息。這實際是別有含義的一種說法援岩,大家不久便能理解歼狼。由于類型為“圓”( Circle )的一個對象也屬于類型為“形狀”( Shape )的一個對象,所以一個圓完全能接收形狀消息享怀。這意味著可讓程序代碼統(tǒng)一指揮“形狀”羽峰,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”添瓷。這一特性稱為對象的“可替換性”梅屉,是 面向?qū)ο笞钪匾母拍钪弧?br> 面向?qū)ο蠼o我們帶來了極大的靈活性,面向?qū)ο缶幊讨形覀兏雨P注的是對象與對象的關系鳞贷,整體的架構(gòu)也就是各個對象之間的關系坯汤。
面向?qū)ο笳Z言的主要特性
這里用java語言來描述
【1】封裝性
封裝體現(xiàn)的是軟件的內(nèi)部有更好的模塊性基礎,
強調(diào)的是“高內(nèi)聚搀愧、低耦合”惰聂,防止程序因相互依賴性而帶來的變動影響。面向?qū)ο蠓庋b的基本單位是對象咱筛,它比傳統(tǒng)的語言更為清晰搓幌,封裝的主要內(nèi)容是對象的屬性以及行為。在一個類中迅箩,對象的屬性用變量或常量來表示溉愁,行為用方法來定義,方法可以直接訪問對象中的一個或多個屬性沙热。把對同一個對象的進行操作的方法和相關的方法放在同一個類中叉钥,把同一個對象的操作和數(shù)據(jù)放在同一個類中。
例如:一個女孩想用手機進行自拍然后分享出去 這個過程就涉及到女孩篙贸、手機投队、自拍照幾個對象,而女孩本身是不能直接生成照片的 拍照是手機里面的功能 所以女孩是使用手機去拍照的 拍照以及分享照片的功能就相當于手機里面封裝的方法爵川,女孩不需要知道它是怎么實現(xiàn)的敷鸦,而是直接調(diào)用手機→拍照這個對象的方法來實現(xiàn)自拍。
這就是面向?qū)ο蟮姆庋b性寝贡。這個例子應該比較形象了……
【2】抽象性
抽象就是找出一些事物的相似和共性之處扒披,然后把它們歸類到一類事物中去,只考慮這些事物
的共性之處圃泡,忽略與這些事物無關的東西碟案。
例如:每個人都有自己的年齡、名字和生日 這些東西是人共同擁有的颇蜡。
如: 定義一個Person類
class Person{
String name;
int age;
String birthday价说;
}
人是有多個方面屬性的事物辆亏,而當前只需了解人的這些最基本的信息,就把它們歸到一個類中鳖目,
這就是一種抽象扮叨。當我們需要時,就根據(jù)不同的對象來傳入對應的參數(shù)领迈,而不需要為每個對象都去重新定義屬性彻磁。抽象就是根據(jù)當前需要的東西去將他們歸類,而不必考慮與它無關的事情狸捅。
【3】繼承性
在定義和實現(xiàn)一個類時衷蜓,可以在一個已經(jīng)存在的類的基礎上來進行,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容薪贫,并且可以繼續(xù)添加新的內(nèi)容恍箭,或者根據(jù)自己的需要進行修改刻恭,這就是繼承瞧省。
舉個很簡單的例子:
定義一個父類
class Father{
public abstract void property();
}
然后 定義一個子類
class Son extends Father{
public void property()鳍贾;
}
這里定義了一個父類和一個子類鞍匾,兒子在父親死后要繼承父親的財產(chǎn)。因為不是和父親做同一種行業(yè)骑科,所以可以把繼承的財產(chǎn)用來自己做生意橡淑。
面向?qū)ο笾械睦^承類似于此。
【4】多態(tài)性
多態(tài)(也稱作動態(tài)綁定咆爽、后期綁定或運行時綁定)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定梁棠,而是在程序運行期間才能夠確定。多態(tài)通過分離做什么和怎么做斗埂,從另一個角度將接口和實現(xiàn)分離開來符糊。多態(tài)不但能夠改善代碼的組織結(jié)構(gòu)和可讀性,還能夠創(chuàng)建可擴展的程序——即無論在項目最初創(chuàng)建時還是在需要加新功能時都可以“生長”的程序呛凶。多態(tài)方法調(diào)用允許一種類型表現(xiàn)出與其它類型相似的區(qū)別男娄,只要他們都是從同一個父類導出的。不修改原程序代碼漾稀,就可以改變程序運行時所綁定的具體代碼模闲,讓程序可以選擇多個運行狀態(tài),極大的增強了程序的靈活性崭捍。
例子:假設在節(jié)假日尸折,和朋友聚在一起,這時突然有人提出一個抽牌游戲殷蛇∈导校……于是我們多態(tài)性就開始了拣播,首先拿來一副撲克牌,你和朋友一人抽一張牌收擦,然后把抽出的牌攤開來比較大小贮配。
先看看如下代碼
Board play=playfactory.getBoard();
player.openBoard(player1)塞赂;
我們抽撲克牌時是隨機的泪勒,調(diào)用getBoard方法抽取到牌后我們并不知道這張牌數(shù)字是多大。每個人抽到的牌都是不一樣的宴猾,也就是說這個過程所得到的對象是不一樣的圆存,而每個人抽牌以及攤開牌的流程都是一樣的,最后在使用openBoard方法分別翻開抽到的牌時才知道自己抽到的牌真正的數(shù)字……(這就類似于動態(tài)綁定 運行時才知道結(jié)果)
從世界的角度來看仇哆,不同對象之間的相互作用與通信構(gòu)成了完整的世界沦辙,世界因本孤立的對象的相互影響而變得豐富,對面向?qū)ο蟮睦斫庖彩菍ΜF(xiàn)實世界的理解讹剔,只有這樣才能更好地與現(xiàn)實世界結(jié)合油讯。
從面向過程到面向?qū)ο笾饕淖兣c提升的是人的思想與思考方式,因此應該用面向?qū)ο蟮谋举|(zhì)去看世界延欠,面向?qū)ο蟮乃枷肽岸摇⒓夹g(shù)能幫助我們構(gòu)建與現(xiàn)實世界相適應的問題模型,并保持著他們的結(jié)構(gòu)由捎、關系和行為模式兔综。