抽象過程
Alan Kay 曾經(jīng)總結(jié)了第一個(gè)成功的面向?qū)ο笳Z言执俩,同時(shí)也是Java所基于的語言之一的Smalltalk的五個(gè)基本特性,這些特性表現(xiàn)了一種純粹的面向?qū)ο蟪绦蛟O(shè)計(jì)方式:
1.萬物皆對(duì)象篱竭。
2.程序是對(duì)象的集合力图,它們通過發(fā)送消息來告知彼此所要做的。
3.每個(gè)對(duì)象都有自己的由其他對(duì)象所構(gòu)成的存儲(chǔ)掺逼。
4.每個(gè)對(duì)象都擁有類型.
5.某一特定類型的所有對(duì)象都可以接受同樣的消息吃媒。
被隱藏的具體實(shí)現(xiàn)
Java用三個(gè)關(guān)鍵字在累的內(nèi)部設(shè)定邊界: public, private, protected.
public: 緊隨其后的元素對(duì)任何人都是可以用的吕喘。
private: 除類型創(chuàng)建者和類型的內(nèi)部方法之外的任何人都不能訪問的元素赘那。 如果試圖訪問,就會(huì)在編譯時(shí)報(bào)錯(cuò)氯质。
protected: 于private相當(dāng)募舟,差別在于繼承的類可以訪問protected成員,但是不能訪問private成員闻察。
Java的默認(rèn)訪問權(quán)限拱礁,當(dāng)沒有使用任何access specifier時(shí),權(quán)限為包訪問權(quán)限辕漂,即同一個(gè)包的成員可以訪問呢灶,不同包的成員如同指定了private一樣。
復(fù)用具體實(shí)現(xiàn)
由于繼承在面向?qū)ο蟪绦蛟O(shè)計(jì)中如此重要钮热,所以被高度強(qiáng)調(diào)填抬,程序員就會(huì)有這樣的印象:處處都應(yīng)該使用繼承。 實(shí)際上隧期,在建立新類的時(shí)候飒责,應(yīng)該首先考慮組合,因?yàn)樗雍?jiǎn)單靈活仆潮。如果采用這種方式宏蛉,設(shè)計(jì)會(huì)變得更加清晰。一旦有了經(jīng)驗(yàn)之后性置,便能夠看出必須使用繼承的場(chǎng)合了拾并。
繼承
導(dǎo)出類與基類具有相同的類型。
有兩種方法可以使積累與導(dǎo)出類產(chǎn)生差異:
1. 直接在導(dǎo)出類中添加新方法鹏浅,這些方法并不是基類的一部分。(is-like-a super class)
2. 改變現(xiàn)有基類的方法的行為隐砸,即覆蓋(overriding) (is-a super class)
伴隨多態(tài)的可互換對(duì)象
在OOP中之碗,程序直到運(yùn)行時(shí)才能夠確定代碼的地址,所以當(dāng)消息發(fā)送到一個(gè)泛化對(duì)象時(shí)季希,必須采用其他的機(jī)制褪那。
“后期綁定”:當(dāng)向?qū)ο蟀l(fā)送消息時(shí)幽纷,被調(diào)用的代碼知道運(yùn)行時(shí)才能確定。編譯器確保被調(diào)用方法的存在并檢查博敬,但并不知道被執(zhí)行的確切代碼友浸。
為了執(zhí)行后期綁定,Java使用一小段特殊的代碼代替絕對(duì)地址的調(diào)用偏窝,動(dòng)態(tài)綁定在Java中是默認(rèn)行為(不同于c++需要添加virtual關(guān)鍵字)
轉(zhuǎn)型
把導(dǎo)出類看做他的基類的過程稱為向上轉(zhuǎn)型(upcasting)這個(gè)是安全的?
把基類看做導(dǎo)出類的過程稱為向下轉(zhuǎn)型, 除非確切的知道所要處理的對(duì)象的類型收恢,否則向下轉(zhuǎn)型幾乎是不安全的。
單根繼承結(jié)構(gòu)
在Java中(事實(shí)上包括除C++意外的所有OOP語言)囚枪,所有的類都繼承Object類派诬。
對(duì)象的創(chuàng)建和生命期
Java在堆(HEAP)的內(nèi)存池中動(dòng)態(tài)的創(chuàng)建對(duì)象劳淆。在這種方式中链沼,知道運(yùn)行時(shí)才知道需要多少對(duì)象,他們的生命期如何沛鸵,以及他們的具體類型是什么括勺。Java完全采用了動(dòng)態(tài)內(nèi)存分類方式(基本類型只是一種特例),每當(dāng)想創(chuàng)建一個(gè)對(duì)象時(shí)曲掰,就要使用new關(guān)鍵字來構(gòu)建對(duì)象的實(shí)例疾捍。
Java的垃圾回收器被設(shè)計(jì)用來處理內(nèi)存釋放問題。垃圾回收器知道對(duì)象什么時(shí)候不被再使用栏妖,并自動(dòng)釋放對(duì)象占的內(nèi)存乱豆,這一點(diǎn)同 “所有對(duì)象都繼承單根基類Object” 以及 “只能在堆上創(chuàng)建對(duì)象” 2個(gè)特性結(jié)合起來,是的Java比C++編程要簡(jiǎn)單的多吊趾。
異常處理
異常是一種對(duì)象宛裕,它從出錯(cuò)地點(diǎn)被“拋出”,并被專門設(shè)計(jì)用來處理特定類型錯(cuò)誤的異常處理器“捕獲”论泛。異常提供了一種從錯(cuò)誤狀態(tài)進(jìn)行可靠恢復(fù)的途徑】現(xiàn)在不再是只能退出程序,你可以進(jìn)行校正屁奏,并且恢復(fù)程序運(yùn)行岩榆。
Java一開始就內(nèi)置了異常處理,而且強(qiáng)制你使用它坟瓢。