第一篇:PHP程序員要養(yǎng)成7個(gè)面向?qū)ο蟮暮昧?xí)慣
PHP程序員要養(yǎng)成7個(gè)面向?qū)ο蟮暮昧?xí)慣
在 PHP 編程早期,PHP 代碼在本質(zhì)上是限于面向過(guò)程的。過(guò)程代碼 的特征在于使用過(guò)程構(gòu)建應(yīng)用程序塊。過(guò)程通過(guò)允許過(guò)程之間的調(diào)用提供某種程度的重用。
但是,沒(méi)有面向?qū)ο蟮恼Z(yǔ)言構(gòu)造,程序員仍然可以把 OO 特性引入到 PHP 代碼中。這樣做有點(diǎn)困難并且會(huì)使代碼難于閱讀,因?yàn)樗腔旌戏独?含有偽 OO 設(shè)計(jì)的過(guò)程語(yǔ)言)。使用 PHP 代碼中的 OO 構(gòu)造 — 例如能夠定義和使用類、能夠構(gòu)建使用繼承的類之間的關(guān)系以及能夠定義接口 — 可以更輕松地構(gòu)建符合優(yōu)秀 OO 實(shí)踐的代碼。
雖然沒(méi)有過(guò)多模塊化的純過(guò)程設(shè)計(jì)運(yùn)行得很好,但是 OO 設(shè)計(jì)的優(yōu)點(diǎn)表現(xiàn)在維護(hù)上。由于典型應(yīng)用程序的大部分生命周期都花費(fèi)在維護(hù)上,因此代碼維護(hù)是應(yīng)用程序生命周期的重要部分。并且在開(kāi)發(fā)過(guò)程中代碼維護(hù)很容易 被遺忘。如果在應(yīng)用程序開(kāi)發(fā)和部署方面存在競(jìng)爭(zhēng),那么長(zhǎng)期可維護(hù)性可能被放在比較次要的地位。
模塊化 — 優(yōu)秀 OO 設(shè)計(jì)的主要特性之一 — 可以幫助完成這樣的維護(hù)。模塊化將幫助封裝更改,這樣可以隨著時(shí)間的推移更輕松地?cái)U(kuò)展和修改應(yīng)用程序。
總的來(lái)說(shuō),雖然構(gòu)建 OO 軟件的習(xí)慣不止 7 個(gè),但是遵循這里的 7 個(gè)習(xí)慣可以使代碼符合基本 OO 設(shè)計(jì)標(biāo)準(zhǔn)。它們將為您提供更牢固的基礎(chǔ),在此基礎(chǔ)之上建立更多 OO習(xí)慣并構(gòu)建可輕松維護(hù)與擴(kuò)展的軟件。這些習(xí)慣針對(duì)模塊化的幾個(gè)主要特性。有關(guān)獨(dú)立于語(yǔ)言的 OO 設(shè)計(jì)優(yōu)點(diǎn)的更多信息,請(qǐng)參閱 參考資料。個(gè)優(yōu)秀 PHP OO習(xí)慣包括:
保持謙虛
做個(gè)好鄰居。
避免看到美杜莎。
利用最弱的鏈接。
您是橡皮;我是膠水。
限制傳播。
考慮使用模式。
保持謙虛
保持謙虛指避免在類實(shí)現(xiàn)和函數(shù)實(shí)現(xiàn)中暴露自己。隱藏您的信息是一項(xiàng)基本習(xí)慣。如果不能養(yǎng)成隱藏實(shí)現(xiàn)細(xì)節(jié)的習(xí)慣,那么將很難養(yǎng)成任何其他習(xí)慣。信息隱藏也稱為封裝。
直接公開(kāi)公共字段是一個(gè)壞習(xí)慣的原因有很多,最重要的原因是讓您在實(shí)現(xiàn)更改中沒(méi)有應(yīng)有的選擇。使用 OO 概念隔離更改,而封裝在確保所作更改在本質(zhì)上不是病毒性(viral)更改方面扮演不可或缺的角色。病毒性 更改是開(kāi)始時(shí)很小的更改 — 如將保存三個(gè)元素的數(shù)組更改為一個(gè)只包含兩個(gè)元素的數(shù)組。突然,您發(fā)現(xiàn)需要更改越來(lái)越多的代碼以適應(yīng)本應(yīng)十分微不足道的更改。
開(kāi)始隱藏信息的一種簡(jiǎn)單方法是保持字段私有并且用公共訪問(wèn)方法公開(kāi)這些字段,就像家中的窗戶一樣。并沒(méi)有讓整面墻都朝外部開(kāi)放,而只打開(kāi)一兩扇窗戶(我將在 “好習(xí)慣:使用公共訪問(wèn)方法” 中介紹訪問(wèn)方法的更多信息)。
除了允許您的實(shí)現(xiàn)隱藏在更改之后外,使用公共訪問(wèn)方法而非直接公開(kāi)字段
將允許您在基本實(shí)現(xiàn)的基礎(chǔ)上進(jìn)行構(gòu)建,方法為覆蓋訪問(wèn)方法的實(shí)現(xiàn)以執(zhí)行略微不同于父方法的行為。它還允許您構(gòu)建一個(gè)抽象實(shí)現(xiàn),從而使實(shí)際實(shí)現(xiàn)委托給覆蓋基本實(shí)現(xiàn)的類。
壞習(xí)慣:公開(kāi)公共字段
在清單 1 的壞代碼示例中,Person 對(duì)象的字段被直接公開(kāi)為公共字段而非使用訪問(wèn)方法。雖然此行為十分誘人,尤其對(duì)于輕量級(jí)數(shù)據(jù)對(duì)象來(lái)說(shuō)更是如此,但是它將對(duì)您提出限制。
清單 1.公開(kāi)公共字段的壞習(xí)慣 classPerson { public$prefix;public$givenName;public$familyName;public$suffix;}
$person=newPerson();$person->prefix=“Mr.”;$person->givenName=“John”;
echo($person->prefix);echo($person->givenName);?>
如果對(duì)象有任何更改,則使用該對(duì)象的所有代碼也都需要更改。例如,如果某人的教名、姓氏和其他名字被封裝到 PersonName 對(duì)象中,則需要修改所有代碼以適應(yīng)更改。
第二篇:PHP程序員的13個(gè)好習(xí)慣
PHP程序員的13個(gè)好習(xí)慣
【原文來(lái)自PHP培訓(xùn)http://train.phphubei.com】
1、使用select從相同的數(shù)據(jù)庫(kù)查詢信息時(shí),使用一個(gè)join語(yǔ)句一次性整齊地獲取你需要的所有信息,而不要寫(xiě)多個(gè)mysql_query/while/mysql_fetch_array語(yǔ)句。
2、如果你在多個(gè)文件中調(diào)用了一個(gè)數(shù)據(jù)庫(kù)連接,創(chuàng)建一個(gè)connection.php文件保存你的連接變量,在需要的地方將這個(gè)文件包括進(jìn)來(lái)。
3、對(duì)于小型項(xiàng)目,將你所有的函數(shù)寫(xiě)在一個(gè)文件中,如果是大型項(xiàng)目就寫(xiě)在對(duì)象中,然后在需要的地方包括這個(gè)文件。
4、如果你的包括文件失控,可以創(chuàng)建一個(gè)include文件包含所有的.inc文件,然后在你需要的地方包括這一個(gè)include文件就可以了。
5、為你的代碼編寫(xiě)文檔,當(dāng)你3個(gè)月后看這些代碼時(shí),你會(huì)用得著。
6、代碼排版,沒(méi)有什么比可讀性更重要了。
7、將邏輯和表現(xiàn)層分開(kāi)。
8、寫(xiě)類時(shí),確保你知道何時(shí)是耦合的最佳時(shí)機(jī),何時(shí)是擴(kuò)展的最佳時(shí)機(jī)。
9、接口是你的朋友。
10、當(dāng)項(xiàng)目變得越來(lái)越大時(shí),將你的代碼分解成模型、視圖和控制器是超級(jí)騙子。
11、在沒(méi)有剝掉HTML標(biāo)記前永遠(yuǎn)不要輸出POST和GET數(shù)據(jù),12、永遠(yuǎn)不要相信來(lái)自用戶的輸入,即使她是你媽媽。
13、永遠(yuǎn)不要把類名搞重復(fù)了,記住,是永遠(yuǎn)!
第三篇:國(guó)外PHP程序員的13個(gè)好習(xí)慣
004km.cn
國(guó)外PHP程序員的13個(gè)好習(xí)慣
以下是編譯的全文:
我是一個(gè)PHP新手,只有6個(gè)月的PHP編程經(jīng)歷,并且是在一位經(jīng)過(guò)認(rèn)證的zend工程師的指導(dǎo)下完成工作的,每當(dāng)我編寫(xiě)腳本時(shí),我會(huì)注意一些能讓我做得更好的細(xì)節(jié),也就是本文列舉的這14個(gè)PHP編碼好習(xí)慣,如果你有更好的建議,歡迎在本文后面的評(píng)論中發(fā)表,我這個(gè)人是喜歡求知的。
1、使用select從相同的數(shù)據(jù)庫(kù)查詢信息時(shí),使用一個(gè)join語(yǔ)句一次性整齊地獲取你需要的所有信息,而不要寫(xiě)多個(gè)mysql_query/while/mysql_fetch_array語(yǔ)句。
2、如果你在多個(gè)文件中調(diào)用了一個(gè)數(shù)據(jù)庫(kù)連接,創(chuàng)建一個(gè)connection.php文件保存你的連接變量,在需要的地方將這個(gè)文件包括進(jìn)來(lái)。
3、對(duì)于小型項(xiàng)目,將你所有的函數(shù)寫(xiě)在一個(gè)文件中,如果是大型項(xiàng)目就寫(xiě)在對(duì)象中,然后在需要的地方包括這個(gè)文件。
4、如果你的包括文件失控,可以創(chuàng)建一個(gè)include文件包含所有的.inc文件,然后在你需要的地方包括這一個(gè)include文件就可以了。
5、為你的代碼編寫(xiě)文檔,當(dāng)你3個(gè)月后看這些代碼時(shí),你會(huì)用得著。
6、代碼排版,沒(méi)有什么比可讀性更重要了。
7、將邏輯和表現(xiàn)層分開(kāi)。
8、寫(xiě)類時(shí),確保你知道何時(shí)是耦合的最佳時(shí)機(jī),何時(shí)是擴(kuò)展的最佳時(shí)機(jī)。
9、接口是你的朋友。
10、當(dāng)項(xiàng)目變得越來(lái)越大時(shí),將你的代碼分解成模型、視圖和控制器是超級(jí)騙子。
11、在沒(méi)有剝掉HTML標(biāo)記前永遠(yuǎn)不要輸出POST和GET數(shù)據(jù),12、永遠(yuǎn)不要相信來(lái)自用戶的輸入,即使她是你媽媽。
13、永遠(yuǎn)不要把類名搞重復(fù)了,記住,是永遠(yuǎn)!(ps:本文章由北大青鳥(niǎo)廣安門(mén)校區(qū)搜集自互聯(lián)網(wǎng))
第四篇:PHP中面向?qū)ο笤O(shè)計(jì)的經(jīng)驗(yàn)總結(jié)
PHP中面向?qū)ο笤O(shè)計(jì)的經(jīng)驗(yàn)總結(jié)
你不必嚴(yán)格遵守這些原則,違背它們也不會(huì)被處以宗教刑罰。但你應(yīng)當(dāng)把這些原則看成警鈴,若違背了其中的一條,那么警鈴就會(huì)響起。-----Arthur J.Riel
1.所有數(shù)據(jù)都應(yīng)該隱藏在所在的類的內(nèi)部。
2.類的使用者必須依賴類的共有接口,但類不能依賴它的使用者。3.盡量減少類的協(xié)議中的消息。
4.實(shí)現(xiàn)所有類都理解的最基本公有接口[例如,拷貝操作(深拷貝和淺拷貝)、相等性判斷、正確輸出內(nèi)容、從ASCII描述解析等等]。
5.不要把實(shí)現(xiàn)細(xì)節(jié)(例如放置共用代碼的私有函數(shù))放到類的公有接口中。如果類的兩個(gè)方法有一段公共代碼,那么就可以創(chuàng)建一個(gè)防止這些公共代碼的私有函數(shù)。6.不要以用戶無(wú)法使用或不感興趣的東西擾亂類的公有接口。
7.類之間應(yīng)該零耦合,或者只有導(dǎo)出耦合關(guān)系。也即,一個(gè)類要么同另一個(gè)類毫無(wú)關(guān)系,要么只使用另一個(gè)類的公有接口中的操作。
8.類應(yīng)該只表示一個(gè)關(guān)鍵抽象。包中的所有類對(duì)于同一類性質(zhì)的變化應(yīng)該是共同封閉的。一個(gè)變化若對(duì)一個(gè)包影響,則將對(duì)包中的所有類產(chǎn)生影響,而對(duì)其他的包不造成任何影響。9.把相關(guān)的數(shù)據(jù)和行為集中放置。設(shè)計(jì)者應(yīng)當(dāng)留意那些通過(guò)get之類操作從別的對(duì)象中獲取數(shù)據(jù)的對(duì)象。這種類型的行為暗示著這條經(jīng)驗(yàn)原則被違反了。
10.把不相關(guān)的信息放在另一個(gè)類中(也即:互不溝通的行為)。朝著穩(wěn)定的方向進(jìn)行依賴。11.確保你為之建模的抽象概念是類,而不只是對(duì)象扮演的角色。
12.在水平方向上盡可能統(tǒng)一地分布系統(tǒng)功能,也即:按照設(shè)計(jì),頂層類應(yīng)當(dāng)統(tǒng)一地共享工作。13.在你的系統(tǒng)中不要?jiǎng)?chuàng)建全能類/對(duì)象。對(duì)名字包含Driver、Manager、System、Susystem的類要特別多加小心。規(guī)劃一個(gè)接口而不是實(shí)現(xiàn)一個(gè)接口。
14.對(duì)公共接口中定義了大量訪問(wèn)方法的類多加小心。大量訪問(wèn)方法意味著相關(guān)數(shù)據(jù)和行為沒(méi)有集中存放。
15.對(duì)包含太多互不溝通的行為的類多加小心。這個(gè)問(wèn)題的另一表現(xiàn)是在你的應(yīng)用程序中的類的公有接口中創(chuàng)建了很多的get和set函數(shù)。
16.在由同用戶界面交互的面向?qū)ο竽P蜆?gòu)成的應(yīng)用程序中,模型不應(yīng)該依賴于界面,界面則應(yīng)當(dāng)依賴于模型。
17.盡可能地按照現(xiàn)實(shí)世界建模(我們常常為了遵守系統(tǒng)功能分布原則、避免全能類原則以及集中放置相關(guān)數(shù)據(jù)和行為的原則而違背這條原則)。
18.從你的設(shè)計(jì)中去除不需要的類。一般來(lái)說(shuō),我們會(huì)把這個(gè)類降級(jí)成一個(gè)屬性。19.去除系統(tǒng)外的類。系統(tǒng)外的類的特點(diǎn)是,抽象地看它們只往系統(tǒng)領(lǐng)域發(fā)送消息但并不接受系統(tǒng)領(lǐng)域內(nèi)其他類發(fā)出的消息。
20.不要把操作變成類。質(zhì)疑任何名字是動(dòng)詞或者派生自動(dòng)詞的類,特別是只有一個(gè)有意義行為的類。考慮一下那個(gè)有意義的行為是
否應(yīng)當(dāng)遷移到已經(jīng)存在或者尚未發(fā)現(xiàn)的某個(gè)類中。
21.我們?cè)趧?chuàng)建應(yīng)用程序的分析模型時(shí)常常引入代理類。在設(shè)計(jì)階段,我們常會(huì)發(fā)現(xiàn)很多代理沒(méi)有用的,應(yīng)當(dāng)去除。
22.盡量減少類的協(xié)作者的數(shù)量。一個(gè)類用到的其他類的數(shù)目應(yīng)當(dāng)盡量少。23.盡量減少類和協(xié)作者之間傳遞的消息的數(shù)量。
24.盡量減少類和協(xié)作者之間的協(xié)作量,也即:減少類和協(xié)作者之間傳遞的不同消息的數(shù)量。25.盡量減少類的扇出,也即:減少類定義的消息數(shù)和發(fā)送的消息數(shù)的乘積。26.如果類包含另一個(gè)類的對(duì)象,那么包含類應(yīng)當(dāng)給被包含的對(duì)象發(fā)送消息。也即:包含關(guān)系總是意味著使用關(guān)系。
27.類中定義的大多數(shù)方法都應(yīng)當(dāng)在大多數(shù)時(shí)間里使用大多數(shù)數(shù)據(jù)成員。
28.類包含的對(duì)象數(shù)目不應(yīng)當(dāng)超過(guò)開(kāi)發(fā)者短期記憶的容量。這個(gè)數(shù)目常常是6。當(dāng)類包含多于6個(gè)數(shù)據(jù)成員時(shí),可以把邏輯相關(guān)的數(shù)據(jù)成員劃分為一組,然后用一個(gè)新的包含類去包含這一組成員。
29.讓系統(tǒng)功能在窄而深的繼承體系中垂直分布。
30.在實(shí)現(xiàn)語(yǔ)義約束時(shí),最好根據(jù)類定義來(lái)實(shí)現(xiàn)。這常常會(huì)導(dǎo)致類泛濫成災(zāi),在這種情況下,約束應(yīng)當(dāng)在類的行為中實(shí)現(xiàn),通常是在構(gòu)造函數(shù)中實(shí)現(xiàn),但不是必須如此。31.在類的構(gòu)造函數(shù)中實(shí)現(xiàn)語(yǔ)義約束時(shí),把約束測(cè)試放在構(gòu)造函數(shù)領(lǐng)域所允許的盡量深的包含層次中。
32.約束所依賴的語(yǔ)義信息如果經(jīng)常改變,那么最好放在一個(gè)集中式的第3方對(duì)象中。33.約束所依賴的語(yǔ)義信息如果很少改變,那么最好分布在約束所涉及的各個(gè)類中。34.類必須知道它包含什么,但是不能知道誰(shuí)包含它。
35.共享字面范圍(也就是被同一個(gè)類所包含)的對(duì)象相互之間不應(yīng)當(dāng)有使用關(guān)系。36.繼承只應(yīng)被用來(lái)為特化層次結(jié)構(gòu)建模。
37.派生類必須知道基類,基類不應(yīng)該知道關(guān)于它們的派生類的任何信息。
38.基類中的所有數(shù)據(jù)都應(yīng)當(dāng)是私有的,不要使用保護(hù)數(shù)據(jù)。類的設(shè)計(jì)者永遠(yuǎn)都不應(yīng)該把類的使用者不需要的東西放在公有接口中。
39.在理論上,繼承層次體系應(yīng)當(dāng)深一點(diǎn),越深越好。
40.在實(shí)踐中,繼承層次體系的深度不應(yīng)當(dāng)超出一個(gè)普通人的短期記憶能力。一個(gè)廣為接受的深度值是6。
41.所有的抽象類都應(yīng)當(dāng)是基類。42.所有的基類都應(yīng)當(dāng)是抽象類。
43.把數(shù)據(jù)、行為和/或接口的共性盡可能地放到繼承層次體系的高端。
44.如果兩個(gè)或更多個(gè)類共享公共數(shù)據(jù)(但沒(méi)有公共行為),那么應(yīng)當(dāng)把公共數(shù)據(jù)放在一個(gè)類中,每個(gè)共享這個(gè)數(shù)據(jù)的類都包含這個(gè)類。
45.如果兩個(gè)或更多個(gè)類有共同的數(shù)據(jù)和行為(就是方法),那么這些類的每一個(gè)都應(yīng)當(dāng)從一個(gè)表示了這些數(shù)據(jù)和方法的公共基類繼承。
46.如果兩個(gè)或更多個(gè)類共享公共接口(指的是消息,而不是方法),那么只有他們需要被多態(tài)地使用時(shí),他們才應(yīng)當(dāng)從一個(gè)公共基類繼承。
47.對(duì)對(duì)象類型的顯示的分情況分析一般是錯(cuò)誤的。在大多數(shù)這樣的情況下,設(shè)計(jì)者應(yīng)當(dāng)使用多態(tài)。
48.對(duì)屬性值的顯示的分情況分析常常是錯(cuò)誤的。類應(yīng)當(dāng)解耦合成一個(gè)繼承層次結(jié)構(gòu),每個(gè)屬性值都被變換成一個(gè)派生類。
49.不要通過(guò)繼承關(guān)系來(lái)為類的動(dòng)態(tài)語(yǔ)義建模。試圖用靜態(tài)語(yǔ)義關(guān)系來(lái)為動(dòng)態(tài)語(yǔ)義建模會(huì)導(dǎo)致在運(yùn)行時(shí)切換類型。
50.不要把類的對(duì)象變成派生類。對(duì)任何只有一個(gè)實(shí)例的派生類都要多加小心。
51.如果你覺(jué)得需要在運(yùn)行時(shí)刻創(chuàng)建新的類,那么退后一步以認(rèn)清你要?jiǎng)?chuàng)建的是對(duì)象?,F(xiàn)在,把這些對(duì)象概括成一個(gè)類。
52.在派生類中用空方法(也就是什么也不做的方法)來(lái)覆寫(xiě)基類中的方法應(yīng)當(dāng)是非法的。53.不要把可選包含同對(duì)繼承的需要相混淆。把可選包含建模成繼承會(huì)帶來(lái)泛濫成災(zāi)的類。54.在創(chuàng)建繼承層次時(shí),試著創(chuàng)建可復(fù)用的框架,而不是可復(fù)用的組件。
55.如果你在設(shè)計(jì)中使用了多重繼承,先假設(shè)你犯了錯(cuò)誤。如果沒(méi)犯錯(cuò)誤,你需要設(shè)法證明。56.只要在面向?qū)ο笤O(shè)計(jì)中用到了繼承,問(wèn)自己兩個(gè)問(wèn)題:(1)派生類是否是它繼承的那個(gè)東西的一個(gè)特殊類型?(2)基類是不是派生類的一部分?
57.如果你在一個(gè)面向?qū)ο笤O(shè)計(jì)中發(fā)現(xiàn)了多重繼承關(guān)系,確保沒(méi)有哪個(gè)基類實(shí)際上是另一個(gè)基類的派生類。
58.在面向?qū)ο笤O(shè)計(jì)中如果你需要在包含關(guān)系和關(guān)聯(lián)關(guān)系間作出選擇,請(qǐng)選擇包含關(guān)系。59.不要把全局?jǐn)?shù)據(jù)或全局函數(shù)用于類的對(duì)象的薄記工作。應(yīng)當(dāng)使用類變量或類方法。60.面向?qū)ο笤O(shè)計(jì)者不應(yīng)當(dāng)讓物理設(shè)計(jì)準(zhǔn)則來(lái)破壞他們的邏輯設(shè)計(jì)。但是,在對(duì)邏輯設(shè)計(jì)作出決策的過(guò)程中我們經(jīng)常用到物理設(shè)計(jì)準(zhǔn)則。61.不要繞開(kāi)公共接口去修改對(duì)象的狀態(tài)。
第五篇:程序員入門(mén):面向?qū)ο笞兂?我的思想
面向?qū)ο笞兂桑业乃枷?/p>
上篇
前言:整理這份資料的目的是為了幫助我的同學(xué)能夠更直觀的理解面向?qū)ο蟮木幊?。讓后?lái)者能夠少走一些彎路。但其中不免有許多漏洞及錯(cuò)誤,也還請(qǐng)前輩提出寶貴的更改意見(jiàn),畢竟交流會(huì)讓我們不斷的進(jìn)步。
技術(shù)是日新月異的,他不會(huì)等待你的成長(zhǎng)。技術(shù)要拿出來(lái)于別人交流,自己學(xué)是自己主觀意識(shí)上的理解,有對(duì)有錯(cuò)!交流會(huì)讓進(jìn)步變得更快。我認(rèn)為如果計(jì)算機(jī)的體系結(jié)構(gòu)不發(fā)生革命性的變化,我們現(xiàn)在所應(yīng)用的程序語(yǔ)言也就百變不離奇蹤了!學(xué)編程學(xué)的是什么?思想!精通一門(mén)編程語(yǔ)言(最好是面向?qū)ο蟮恼Z(yǔ)言)后再去搞其他的編程語(yǔ)言,你會(huì)發(fā)現(xiàn)過(guò)程是如此的行云流水!為什么?你已經(jīng)把編程的思想掌握了,再去學(xué)其他的,無(wú)非是學(xué)習(xí)一種新的語(yǔ)法格式了。
我在這里并不是和你討論怎么去用C++或JAVA,也不是和你討論怎么去學(xué)他們,我要和你討論的是怎么去理解面向?qū)ο?。其中主要?huì)涉及到“類、對(duì)象、繼承、屬性、方法、靜態(tài)、重載、隱藏、重構(gòu)、聲明、定義、初始化、賦值等”其中有許多相關(guān)技術(shù)我只會(huì)一代而過(guò),讓你有一種到此一游的意味我就達(dá)到目的了,而更詳細(xì)的技術(shù)內(nèi)幕,就請(qǐng)參考其他相關(guān)書(shū)籍而深入研究吧!因?yàn)槲抑皇窃诤湍闾接懭绾稳ジ玫睦斫饷嫦驅(qū)ο螅?/p>
如何去提高效率?重復(fù)使用資源,把別人的東西拿來(lái)就用。這是很不錯(cuò)的主意!而對(duì)于你來(lái)說(shuō),最大的資源就是信心以及積極性!好,打起精神來(lái),讓我們一同到面向?qū)ο蟮木幊讨腥び脑L勝吧!
注:文章中所有程序?qū)嵗叶际褂肑AVA寫(xiě)的,當(dāng)然在C++中也就大同小異了了,不同的地方我會(huì)指出!
注:文章中的正文文字用黑色,說(shuō)明文字用藍(lán)色,強(qiáng)調(diào)文字用橙色,批改文字用紅色!
正文: 1.基本概念: 1.1 類與對(duì)象的初探
要我說(shuō),無(wú)論是面向過(guò)程的語(yǔ)言也好,面向?qū)ο蟮恼Z(yǔ)言也罷,我首先要給他講的都是類和對(duì)象!--------“這個(gè)世界是由什么組成的?”這個(gè)問(wèn)題如果讓不同的人來(lái)回答會(huì)得到不同的答案。如果是一個(gè)化學(xué)家,他也許會(huì)告訴你“還用問(wèn)嘛?這個(gè)世界是由分子、原子、離子等等的化學(xué)物質(zhì)組成的”。如果是一個(gè)畫(huà)家呢?他也許會(huì)告訴你,“這個(gè)世界是由不同的顏色所組成的”。??呵呵,眾說(shuō)紛紜吧!但如果讓一個(gè)分類學(xué)家來(lái)考慮問(wèn)題就有趣的多了,他會(huì)告訴你“這個(gè)世界是由不同類型的物與事所構(gòu)成的”好!作為面向?qū)ο蟮某绦騿T來(lái)說(shuō),我們要站在分類學(xué)家的角度去考慮問(wèn)題!是的,這個(gè)世界是由動(dòng)物、植物等組成的。動(dòng)物又分為單細(xì)胞動(dòng)物、多細(xì)胞動(dòng)物、哺乳動(dòng)物等等,哺乳動(dòng)物又分為人、大象、老虎??就這樣的分下去了!
現(xiàn)在,站在抽象的角度,我們給“類”下個(gè)定義吧!我的意思是,站在抽象的角度,你回答我“什么是人類?”首先讓我們來(lái)看看人類所具有的一些特征,這個(gè)特征包括屬性(一些參數(shù),數(shù)值)以及方法(一些行為,他能干什么?。?。每個(gè)人都有身高、體重、年齡、血型等等一些屬性。人會(huì)勞動(dòng)、人都會(huì)直立行走、人都會(huì)用自己的頭腦去創(chuàng)造工具等等這些方法!人之所以能區(qū)別于其它類型的動(dòng)物,是因?yàn)槊總€(gè)人都具有人這個(gè)群體的屬性與方法?!叭祟悺敝皇且粋€(gè)抽象的概念,它僅僅是一個(gè)概念,它是不存在的實(shí)體!但是所有具備“人類”這個(gè)群體的屬性與方法的對(duì)象都叫人!這個(gè)對(duì)象“人”是實(shí)際存在的實(shí)體!每個(gè)人都是人這個(gè)群體的一個(gè)對(duì)象。老虎為什么不是人?因?yàn)樗痪邆淙诉@個(gè)群體的屬性與方法,老虎不會(huì)直立行走,不會(huì)使用工具等等!所以說(shuō)老虎不是人!
由此可見(jiàn)-------類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。在程序中,類實(shí)際上就是數(shù)據(jù)類型!例如:整數(shù),小數(shù)等等。整數(shù)也有一組特性和行為。面向過(guò)程的語(yǔ)言與面相對(duì)象的語(yǔ)言的區(qū)別就在于,面向過(guò)程的語(yǔ)言不允許程序員自己定義數(shù)據(jù)類型,而只能使用程序中內(nèi)置的數(shù)據(jù)類型!而為了模擬真實(shí)世界,為了更好的解決問(wèn)題,往往我們需要?jiǎng)?chuàng)建解決問(wèn)題所必需的數(shù)據(jù)類型!面向?qū)ο缶幊虨槲覀兲峁┝私鉀Q方案。
1.2 內(nèi)置數(shù)據(jù)類型與函數(shù):
計(jì)算機(jī)程序在存儲(chǔ)數(shù)據(jù)時(shí)必須跟蹤3個(gè)基本屬性為:
1. 信息存儲(chǔ)在何處; 2. 存儲(chǔ)的值是多少; 3. 存儲(chǔ)的信息是什么類型的;
讓我們來(lái)看看編程語(yǔ)言的內(nèi)置數(shù)據(jù)類型都有哪些?。ê呛牵@個(gè)不大好說(shuō),因?yàn)槊块T(mén)語(yǔ)言都有自己獨(dú)特的數(shù)據(jù)類型,但這畢竟是少數(shù),比如在JAVA中有byte類型的數(shù)據(jù),而在C++中就沒(méi)有,希望你能舉一反三?。┍热缯麛?shù)”int ”,浮點(diǎn)類型的數(shù)據(jù)”float”!字符串”String”,以及數(shù)組還有結(jié)構(gòu)體等等。然而在寫(xiě)程序的時(shí)候,根據(jù)需要我們會(huì)創(chuàng)建一個(gè)類型的變量或常量,例如:由于我們需要?jiǎng)?chuàng)建一個(gè)整形的變量i為5,我們就可以這樣做,int i = 5;而根據(jù)需要我很有可能改變i的值,也就是從新給它賦值,比如讓它等與6,就可以在所需的地方改成i = 6;由此我們知道,在“值”上可以發(fā)生變化的量就叫變量。不會(huì)發(fā)生變化的量就叫做常量了,在C++中用count關(guān)鍵字來(lái)聲明,而在JAVA中則使用final關(guān)鍵字來(lái)聲明。由于不同語(yǔ)言的聲明格式不一樣,這里就不做一一介紹了,詳細(xì)的內(nèi)容清查閱相關(guān)書(shū)籍!
在這里我們主要討論一下函數(shù),我們可以把函數(shù)想象成一個(gè)“實(shí)現(xiàn)某種特定功能的黑匣子”-------這個(gè)功能是由你來(lái)設(shè)定的,舉個(gè)例子來(lái)說(shuō):現(xiàn)在我問(wèn)你“2+3等于多少”?我相信你能很快的回答我等于5。讓我們來(lái)分析分析這句話包含什么信息!首先我要把你的大腦想象成是一個(gè)黑匣子,我并不知道也沒(méi)有必要知道你的大腦是如何工作的(也就是怎么運(yùn)算的),我關(guān)心的只是我傳給你的是什么信息?你對(duì)信息做了哪些處理? 以及你返回給我的是什么信息?需要提醒你一下的是每個(gè)方法都會(huì)返回一個(gè)信息給調(diào)用者的,除了構(gòu)造函數(shù)外(稍候我會(huì)作詳細(xì)的介紹)。我現(xiàn)在需要把自己當(dāng)作是一名程序員,而你呢?當(dāng)然就是計(jì)算機(jī)了!計(jì)算即可沒(méi)有人那么聰明,它只會(huì)按事先約好的特定的格式運(yùn)行,我想讓它具有如上所述的功能,我就要先定義這個(gè)黑匣子!首先我要告訴這個(gè)黑匣子會(huì)有兩個(gè)整數(shù)值給你(這就是所謂的參數(shù),是程序員需要給黑匣子的信息),然后就要定義這個(gè)黑匣子內(nèi)部實(shí)現(xiàn)這兩個(gè)整數(shù)相加的運(yùn)算(這就是黑匣子對(duì)數(shù)據(jù)所做的加工,根據(jù)需要,你可以做任何的加工。)。最后再標(biāo)注它返回給我一個(gè)同樣是整型的數(shù)值(這是黑匣子返回給程序員的信息)。一個(gè)函數(shù)就這樣定義完了,讓我們來(lái)看看書(shū)寫(xiě)格式:
int addnum(int x,int y){ } 具體的含義是這樣的:
int /*返回值類型*/ addnum /*方法(黑匣子)名稱*/(int x,int y/*傳入的參數(shù)*/){ */
} 首先請(qǐng)注意上明的“return”語(yǔ)句!return 關(guān)鍵字的含義是向調(diào)用者返回緊跟在它后面的信息!就像上面一樣,因?yàn)槲覇?wèn)你,你才會(huì)回答我,如果我不問(wèn)你,你就不用回答我的!在計(jì)算機(jī)中也一樣,定義好這個(gè)函數(shù)在哪里調(diào)用呢?我只能告訴你,哪里需要就在哪里調(diào)用!當(dāng)然,你可以根據(jù)需要去更改參數(shù)、返回值以及內(nèi)部實(shí)現(xiàn),具體到如何定義如何調(diào)媚闃緩萌ゲ慰枷喙氐淖柿狹?!灾q飫鏤抑皇歉鬩桓鏊枷耄?/SPAN>
有時(shí)你會(huì)遇到這樣的問(wèn)題,我讓你記住,我的年齡是20歲!從字面上理解,你并沒(méi)有給我返回信息!然而事實(shí)上,你確實(shí)給我返回了信息,信息的內(nèi)容是“無(wú)信息,也就是無(wú)返回值類型void”。具體的程序如下:
int myAge = 0;int a=20;void remAge(int a){ } 具體的函數(shù)說(shuō)明如下: myAge=a;return x+y;/*內(nèi)部是想方法(實(shí)現(xiàn)相加運(yùn)算,)并用return返回給調(diào)用者結(jié)果return x+y;int myAge =0;//定義并初始化我的年齡為0; int a=20;/*定義變量a等于20*/
void /*返回值類型為無(wú)返回值類型*/ remAge /*函數(shù)名稱*/(int a /*傳入的參數(shù)*/){ } 關(guān)于函數(shù)的話題還有很多很多,這里就不一一介紹了,我的目的是讓你知道函數(shù)是怎么一會(huì)事兒!為下面的討論作鋪墊!1.3 指針以及引用:
指針及引用是在C++中有的,JAVA中沒(méi)有。JAVA中取消了對(duì)內(nèi)存的操作,隨之而來(lái)的事也取消了操作符重載的操作。不過(guò)在稍候我還是會(huì)介紹一些操作符重載的功能等。引用主要還是用在函數(shù)參數(shù)的傳遞上。所以我在這里就不做過(guò)多的介紹了。他們很實(shí)用,有興趣的同學(xué)可以參閱C++相關(guān)書(shū)籍。.4 運(yùn)算符及控制語(yǔ)句:
還是自己看看相關(guān)書(shū)籍吧,這里就不再熬述了!2.深入探討面向?qū)ο螅?2.1“類型”的內(nèi)部細(xì)節(jié):
有了上面的知識(shí),我們現(xiàn)在就可以深入的挖掘類的內(nèi)部實(shí)現(xiàn)了。所有的知識(shí)點(diǎn)我都會(huì)圍繞著類與對(duì)象展開(kāi),在此之前,我希望你能夠確信對(duì)以上所介紹的基本內(nèi)容已完全掌握了!
是的,面向?qū)ο蟮木幊陶Z(yǔ)言最大的特色就是可以編寫(xiě)自己所需的數(shù)據(jù)類型,以更好的解決問(wèn)題。我想我必須要幫你搞清楚“類,對(duì)象,屬性,方法它們之間的關(guān)系”!就像我前面所說(shuō)的,人這個(gè)“類”是什么也做不了的,因?yàn)椤叭祟悺敝皇且粋€(gè)抽象的概念,它不是實(shí)實(shí)在在的“東西”,而這個(gè)“東西”就是所謂的對(duì)象。只有人這個(gè)“對(duì)象”才能去工作。而類呢?類是對(duì)象的描述!對(duì)象從類中產(chǎn)生出來(lái)!此時(shí),對(duì)象具有類所描述的所有的屬性以及方法。-------一定要理解這句話!!
也許你已經(jīng)有些不知所措了,沒(méi)關(guān)系!好好的回味一下,我再舉個(gè)例子!例如電視機(jī),電視機(jī)都有工作原理圖,那么什么叫電視機(jī)呢?只要它能夠?qū)崿F(xiàn)工作原理圖的所有功能的物體,我們都叫它電視機(jī)。你想想是不是這么一回事兒?可是,電視機(jī)原理圖是不能工作的,也就是這個(gè)原理圖不能收看節(jié)目,只有電視機(jī)這個(gè)“實(shí)體——即所謂的對(duì)象”才能收看節(jié)目,也就是說(shuō),從類生成出對(duì)象之后才算得上是真正的有意義!才能開(kāi)始工作。此時(shí),電視機(jī)擁有電視原理圖所描述的所有的屬性及方法!明白了吧,呵呵!myAge=a;//內(nèi)部實(shí)現(xiàn)方法,注意,沒(méi)有return返回??!我先前介紹過(guò),類是屬性與方法的集合。而這些屬性與方法可以被聲明為私有的(private),公共的(public)或是受保護(hù)(protected)的,他們描述了對(duì)類成員的訪問(wèn)控制。下面我分別做一下介紹:
1. 公共的(public):把變量聲明為公共類型的之后,那么就可以通過(guò)對(duì)象來(lái)直接訪問(wèn),一切都是暴露無(wú)遺的!也就是說(shuō),你的信用卡密碼別人也能夠直接得到。2. 私有的(private):如果把變量聲明為私有的情況就好多了,想要得到我的信用卡密碼,對(duì)象必須要調(diào)用專用的方法才能夠得到。3. 受保護(hù)的(protected):介紹繼承時(shí)再討論。
4. 默認(rèn)控制訪問(wèn)符(friendly)://JAVA中有而C++中沒(méi)有。
為了實(shí)現(xiàn)數(shù)據(jù)的封裝,提高數(shù)據(jù)的安全性,我們一般會(huì)把類的屬性聲明為私有的,而把類的方法聲明為公共的。這樣,對(duì)象能夠直接調(diào)用類中定義的所有方法,當(dāng)對(duì)象想要修改或得到自己的屬性的時(shí)候就必須要調(diào)用以定義好的專用的方法才能夠?qū)崿F(xiàn)。你想想,你會(huì)把你的信用卡密碼公布出來(lái)嘛?呵呵!所以,我們提倡的是:“對(duì)象調(diào)方法,方法改屬性”; 2.2通過(guò)實(shí)例看內(nèi)存分配:
說(shuō)了這么多,讓我們來(lái)看一個(gè)實(shí)例吧!比如:現(xiàn)在我們要編寫(xiě)某家公司員工管理系統(tǒng),你認(rèn)為最合適的數(shù)據(jù)類型是什么?我認(rèn)為是員工個(gè)人!但是在面向過(guò)程的語(yǔ)言中,這樣做是不允許的,因?yàn)樗荒苁褂谜Z(yǔ)言中的內(nèi)部數(shù)據(jù)類型!而員工不在這個(gè)內(nèi)部數(shù)據(jù)類型之內(nèi)!也許有人會(huì)說(shuō)可以用C語(yǔ)言中的struct,好注意!畢竟它是類的基礎(chǔ)!如果你以前是一名面C或B的程序員,請(qǐng)你忘掉這些,讓我們一起看看如何用類來(lái)實(shí)現(xiàn)這一切吧!
某家公司的員工是人類的一個(gè)特殊群體,它除了具備人類的所有特性與方法外,它還有額外的特性與方法,比如她有她的工資、信用卡密碼、作息時(shí)間等等,這些特性以及工作內(nèi)容,工作量等等這些方法。而在計(jì)算機(jī)中我們?cè)撊绾味x這個(gè)類呢?下面我將寫(xiě)出它的格式,讓你看看在計(jì)算機(jī)中它是張什么樣子的!
/*在此我需要再次聲明的是,我用的是JAVA格式,在語(yǔ)法格式上它與C++大不相同!許多細(xì)節(jié)以及內(nèi)部操作都有諸多區(qū)別,而在思想上確實(shí)大同小異的*/ //employee.java public class employee{
private String name;//員工姓名 private int age;//員工年齡 private char sex;//員工性別 private float emolument;//員工薪水 private boolean lunch;//員工午餐
//??等等
public void heater(){ //這個(gè)方法是用來(lái)加工員工的午餐
} lunch = true;
public void setName(String a){ //這個(gè)方法是修改員工的姓名 } public String getName(){ //這個(gè)方法是得到員工的姓名
}
//??等等
} 這樣我們就定義完了我們所需要的數(shù)據(jù)類型?,F(xiàn)在,讓我們來(lái)看看它能夠干什么以及怎么工作!
我想要做的是,工作室里有一個(gè)光桿司令叫“jingwei”,我修改它的名字后對(duì)對(duì)它進(jìn)行輸出,看看我是怎么做的吧!
注意:請(qǐng)仔細(xì)觀察對(duì)象是如何調(diào)用方法的,它使用了“.”操作符!事實(shí)上是這樣的,對(duì)象調(diào)用公共的屬性或方法時(shí)就會(huì)使用“.”操作符。
然而在C++中,如果定義一個(gè)同類型的指針,該指針調(diào)用此對(duì)象的方法時(shí),就會(huì)使用“->”操作符。更詳細(xì)的內(nèi)容清參閱相關(guān)書(shū)籍了!
//workstation.java import java.awt.Graphics;import java.applet.Applet;return name;name= a;
public class workstation extends Applet{
} 輸出結(jié)果是: my name is jw private employee jingwei;//對(duì)象的聲明,此時(shí)并不分配內(nèi)存!public void init(){
} public void paint(Graphics g){ } g.drawString(“my age is ”+jingwei.getName(),10,10);//顯示我的年齡 jingwei = new employee();/*此時(shí)創(chuàng)建對(duì)象會(huì)調(diào)用構(gòu)造函數(shù),稍候介紹*/ jingwei.setName(癹w”);//設(shè)置我的名字
這串字符串是在輸出窗口的x坐標(biāo)軸為10 px , y坐標(biāo)軸為10 px的位置。我現(xiàn)在要做的是,把上面的程序做個(gè)大解剖,讓你能夠看清楚它到底是怎么一回事兒?。ㄎ铱刹粫r(shí)帶你去看里面的匯編,呵呵,那個(gè)我也不會(huì):)
首先還是來(lái)看看我們自定義的數(shù)據(jù)類型employee,在應(yīng)用的時(shí)候它和int類型的數(shù)據(jù)沒(méi)什么兩樣,一樣的需要?jiǎng)?chuàng)建變量(對(duì)象),只不過(guò)前者是咱自己定義的,而后這是它內(nèi)置的。Employee這個(gè)類中有許多屬性,也有許多方法。而此時(shí),我們不能直接用我們所創(chuàng)建出來(lái)的對(duì)象調(diào)用它的屬性進(jìn)行修改。因?yàn)樗莗rivate受保護(hù)類型的!我要想修改我的姓名我就要用對(duì)象調(diào)用setName()這個(gè)方法,而我想得到我的姓名就要調(diào)用getName()這個(gè)方法。我們完全是按照航線來(lái)行走的,這個(gè)航線就是“對(duì)象調(diào)方法,方法改屬性” 好的,我真的相信你已經(jīng)明白了這是怎么一回事兒了!呵呵!仰起航帆,繼續(xù)前行!
現(xiàn)在讓我們一起來(lái)看看workstation這個(gè)類。這是個(gè)主類,和C++中的main()函數(shù)的味道差不多。其中,在JAVA中,一個(gè)文件只允許有而且必須有一個(gè)主類,這個(gè)主類用public來(lái)聲明!他就跟C++中必須要有一個(gè)main()函數(shù)是一樣的。
讓我們來(lái)看看這個(gè)類中的第一條語(yǔ)句!private employee jingwei;這條語(yǔ)句的作用是聲明一個(gè)employee的對(duì)象jingwei(在C++中就不用聲明了)。我想要和你說(shuō)的是“聲明”與“定義”之間的區(qū)別。聲明只是告訴計(jì)算機(jī)將要有這樣的一個(gè)變量(對(duì)象),在內(nèi)存中它并不為這個(gè)變量(對(duì)象)分配內(nèi)存!而只有在定義的時(shí)候才會(huì)給這個(gè)變量(對(duì)象)分配內(nèi)存。(需要說(shuō)明一下的是init()方法是完成初始化操作的,在此處定義對(duì)象,為對(duì)象分配內(nèi)存。start()方法用來(lái)啟動(dòng)瀏覽器的主線程,paint()方法來(lái)顯示Apple的界面。這些是Applet程序所需的,至于Application程序就不需要了,當(dāng)然了,C++中也不需要他們。關(guān)于他們的詳細(xì)內(nèi)容清參閱相關(guān)書(shū)籍)
緊接著就開(kāi)始定一個(gè)對(duì)象了,對(duì)jingwei這個(gè)對(duì)象進(jìn)行操作才會(huì)有實(shí)際的意義。千萬(wàn)不要有這種想法:“試圖對(duì)類進(jìn)行操作!”就像前面我說(shuō)的,電視機(jī)原理不能看電視一樣!這是毫無(wú)意義的!看這條語(yǔ)句jingwei = new employee();它的意思就是定義一個(gè)employee類型的對(duì)象jingwei。此時(shí),我想告訴你的是:“jingwei這個(gè)對(duì)想擁有了些什么”。它擁有了類所描述的所有的屬性及方法。下面我一一給你列出來(lái):
/*所有的employee對(duì)象都擁有這些屬性。每創(chuàng)建一個(gè)對(duì)象就會(huì)從新分配一塊內(nèi)存來(lái)存放相應(yīng)對(duì)象的這些屬性。我的意思是每個(gè)對(duì)象都有自己“獨(dú)特”的一份*/
private String name;//員ば彰?/SPAN>
private int age;//員工年齡 private char sex;//員工性別 private float emolument;//員工薪水 private boolean lunch;//員工午餐
/*所有的employee對(duì)象都擁有這些方法。但在內(nèi)存中只有一份*/
public void heater(){ //這個(gè)方法是用來(lái)加工員工的午餐
} public void setName(String a){ //這個(gè)方法是修改員工的姓名
} public String getName(){ //這個(gè)方法是得到員工的姓名
} return name;name= a;lunch = true;/*但是,實(shí)際上在創(chuàng)建jingwei這個(gè)對(duì)象時(shí)計(jì)算機(jī)只給這個(gè)對(duì)象的所有的屬性分配了內(nèi)存,而并沒(méi)有給方法分配內(nèi)存。方法只有一個(gè),是屬于所有的對(duì)象的,所以無(wú)論創(chuàng)建了多少個(gè)對(duì)象,計(jì)算機(jī)只會(huì)為一個(gè)方法分配一塊內(nèi)存。*/ 我想我還是舉個(gè)例子吧,不然你非暈倒不可。呵呵!
看我這條語(yǔ)句“private boolean lunch;”公司不管午餐,每個(gè)員工都需要帶飯。我們現(xiàn)在這樣想,公司的空間是所有的內(nèi)存容量,你的辦公桌就是計(jì)算機(jī)中的內(nèi)存中的一部分(每個(gè)員工都有一份,是在創(chuàng)建對(duì)象時(shí)分配的)。你把午飯帶到了公司,放在了你的辦公桌上?!拔顼垺闭紦?jù)了你的辦公桌的一角(占了你自己“對(duì)象”的一塊內(nèi)存容量)。這份午飯只屬于你自己,同樣別人的也只屬于她自己!所以每個(gè)員工(對(duì)象)都需要一快空間(內(nèi)存)來(lái)存放自己的午餐(屬性)。在計(jì)算機(jī)中也是這樣的,每創(chuàng)建一個(gè)對(duì)象,就會(huì)在內(nèi)存中從新分配一塊內(nèi)存來(lái)放“午餐——lunch”這個(gè)屬性(對(duì)象所擁有的所有的屬性)。
計(jì)算機(jī)只會(huì)為對(duì)象的屬性分配內(nèi)存。因?yàn)槊總€(gè)對(duì)象的都不一樣!就像你往公司帶的午飯和我往公司帶的午飯不一樣是一個(gè)道理!但方法就不同了。早晨帶的飯中午就涼了,你需要用微波爐來(lái)加熱。微波爐可不用你帶,公司就有(只占公司的一塊空間),它放在了午餐桌上。你想想,微波爐屬于誰(shuí)的?它屬于所有員工的!因?yàn)槊總€(gè)員工都可以用它。而不必每個(gè)員工都帶一份。由此可見(jiàn),每個(gè)員工(對(duì)象)都有一份午飯(屬性),但所有的員工(對(duì)象)只一個(gè)微波爐(方法)。所有的員工(對(duì)象)都可以通過(guò)這個(gè)微波爐(方法)來(lái)改變自己午餐(屬性)的冷熱狀態(tài)。殊途同歸!在計(jì)算機(jī)中也就是這樣,方法只有一份,供所有的對(duì)象使用!而屬性是每個(gè)對(duì)象一份,因?yàn)槊總€(gè)對(duì)象的都不一樣。別和我說(shuō)你還不明白,不然我會(huì)撞墻的,呵呵:)
下篇
2.3深入探討函數(shù):
2.3.1構(gòu)造函數(shù)、默認(rèn)構(gòu)造函數(shù)、缺省構(gòu)造函數(shù)
對(duì)于上面的實(shí)例,它已經(jīng)能完成絕大部分工作了,但它還是不完善的,還有許許多多的細(xì)節(jié)等到我們?nèi)ネ晟疲∫苍S有的同學(xué)已經(jīng)注意到了,當(dāng)我創(chuàng)建完“jingwei”這個(gè)對(duì)象時(shí),這個(gè)對(duì)象的所有的屬性都是空的,也就是說(shuō):這個(gè)對(duì)象的姓名是未定的、年齡是未定的、性別是未定的、薪水是未定的、午餐也是未定的。而我們想把這些屬性都添加上去,就還要用對(duì)象調(diào)用相應(yīng)的方法,去一個(gè)個(gè)修改!天啊,這簡(jiǎn)直是太麻煩了!有沒(méi)有什么好方法能夠在我們創(chuàng)建對(duì)象的同時(shí)就完成了對(duì)屬性賦值的操作呢?哦不,應(yīng)該說(shuō)是對(duì)屬性的初始化呢?當(dāng)然沒(méi)問(wèn)題了,這就需要所謂的構(gòu)造函數(shù)!
構(gòu)造函數(shù)是類中最特殊的函數(shù),它與析構(gòu)函數(shù)的功能正好相反!
從特征上來(lái)說(shuō):1.它是編程語(yǔ)言中唯一沒(méi)有返回值類型的函數(shù)。
2.它的名稱與類的名稱必須要完全相同。3.它必須被聲明為公共(public)的類型
4,可以對(duì)構(gòu)造函數(shù)進(jìn)行重載。5.它在創(chuàng)建對(duì)象是自動(dòng)被調(diào)用。
從功能上來(lái)說(shuō):1.它是對(duì)類中的屬性進(jìn)行初始化。
其實(shí),對(duì)于上面的程序來(lái)說(shuō)我們沒(méi)有自己定義構(gòu)造函數(shù)。但是,在這種情況下,系統(tǒng)會(huì)自動(dòng)為我們定義一個(gè)“默認(rèn)構(gòu)造函數(shù)”。他會(huì)把數(shù)值變量自動(dòng)賦值為0,把布爾行變量賦值為false等等(但在C++中,默認(rèn)構(gòu)造函數(shù)不初始化其成員)。如果程序員定義了構(gòu)造函數(shù),那么系統(tǒng)就不會(huì)再為你的程序添加一個(gè)缺默認(rèn)造函數(shù)了。(在這里,我們提倡的是自己定義構(gòu)造函數(shù),而不是用系統(tǒng)的默認(rèn)構(gòu)造函數(shù))
還是看個(gè)實(shí)例吧!這樣比較清楚一些!//employee.java public class employee{
private String name;//員工姓名 private int age;//員工年齡 private char sex;//員工性別 private float emolument;//員工薪水 private boolean lunch;//員工午餐
//??等等
public employee(){ //這個(gè)就是“默認(rèn)”構(gòu)造函數(shù)
}
public void heater(){ //這個(gè)方法是用來(lái)加工員工的午餐 name = “jw”;//設(shè)置員工姓名 age = 20;//設(shè)置員工年齡 sex = “M”;//設(shè)置員工性別 emolument = 100;//設(shè)置員工薪水 lunch = false;//設(shè)置員工午餐 } lunch = true;
//??等等
};這樣,在我們創(chuàng)建“jingwei”這個(gè)對(duì)象的同時(shí),它的所有的屬性也被初始化了!顯然,這大大的提高了工作效率,但是,它還是不符合要求。想想看,如果我們現(xiàn)在創(chuàng)建這個(gè)類型的第二個(gè)對(duì)象的時(shí)候會(huì)發(fā)生什么事情?告訴你,除了對(duì)象的“名”(這個(gè)名稱不在是對(duì)象屬性中的名稱,而是對(duì)象本身的名稱)不一樣外,其所有的“屬性值”都一樣!比如:現(xiàn)在我們創(chuàng)建第二個(gè)對(duì)象flashmagic,然而我會(huì)發(fā)現(xiàn)這個(gè)對(duì)象的所有的屬性和jingwei這個(gè)對(duì)象的所有的屬性完全相同。而我們只能在用對(duì)象的方法去改變著寫(xiě)屬性了!很顯然,這種方法不大好!我們需要一種方法在創(chuàng)建對(duì)象的時(shí)候?yàn)閷?duì)象的屬性賦予“我們想要的值”。相信你也看到了,默認(rèn)構(gòu)造函數(shù)就顯得無(wú)能為力了。我們需要的是帶參數(shù)的構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí),我們把參數(shù)傳給構(gòu)造函數(shù),這樣就能完成了上述的功能!口說(shuō)無(wú)憑,還是來(lái)看個(gè)實(shí)例吧: //employee.java public class employee{
private String name;//員工姓名 private int age;//員工年齡 private char sex;//員工性別 private float emolument;//員工薪水 private boolean lunch;//員工午餐
數(shù)
name = n;//設(shè)置員工姓名 age = a;//設(shè)置員工年齡 sex = s;//設(shè)置員工性別 emolument = e;//設(shè)置員工薪水 //??等等
public employee(String n,int a,char s,float e,boolean l){ //看這個(gè)構(gòu)造函
} lunch =l;//設(shè)置員工午餐
public void heater(){ //這個(gè)方法是用來(lái)加工員工的午餐
}
//??等等
};這樣一來(lái),在創(chuàng)建對(duì)象的同時(shí)我們就可以給他賦予我們想要的值,很顯然,這可就方便多了。哦,對(duì)了!還沒(méi)有告訴你怎么創(chuàng)建呢!哈哈,往前翻幾頁(yè)你會(huì)看到這句話:
jingwei = new employee();這是創(chuàng)建一個(gè)對(duì)象,而我們把它改成
jingwei = new employee(“jingwei”,20,'M',100,false);這樣一來(lái),所有的工作都完成了,呵呵?。ㄔ趧?chuàng)建對(duì)象的同時(shí)賦予了我們想要的“初值”)lunch = true;2.3.2重載構(gòu)造函數(shù):
我還是先把概念給你吧,讓你有個(gè)認(rèn)識(shí),隨后我們?cè)谶M(jìn)行論述。在JAVA中:
1.函數(shù)重載是一個(gè)類中聲明了多個(gè)同名的方法,但有不同的參數(shù)個(gè)數(shù)和參數(shù)類型。2.函數(shù)重構(gòu)是指在子類中聲明與父類同名的方法,從而覆蓋了父類的方法。重構(gòu)解決了子類與父類的差異問(wèn)題。(在討論到繼承時(shí)我會(huì)詳細(xì)說(shuō)明)
在C++中:
1. 數(shù)重載的概念一樣。
2. 重構(gòu)的概念可就不一樣了,C++中功能更為龐大的虛函數(shù)。更詳細(xì)內(nèi)容這里就不錯(cuò)過(guò)多介紹了!
其實(shí)關(guān)于重載的概念你并不陌生,在編程中相信你也接觸過(guò)。呵呵!讓我們來(lái)舉個(gè)操作符重載的例子你就會(huì)明白了,(JAVA中不支持這個(gè)功能)我們定義三個(gè)整數(shù)變量:
int i1=2, i2=3,i3=0;i3 = i1 + i2;此時(shí)i3=5;加號(hào)實(shí)現(xiàn)了兩個(gè)數(shù)相加的運(yùn)算功能。然而我們現(xiàn)在要定義三個(gè)字符串變量:
String str1=”jing”, str2=”wei”,str3=””;str3 = str1 + str2;此時(shí)str3 = “jingwei”;加號(hào)實(shí)現(xiàn)了兩個(gè)字符串相加的運(yùn)算功能。同樣是加號(hào),既可以把兩個(gè)整型的變量加在一起,也可以把兩個(gè)字符串類型的變量加在一起。同一個(gè)操作符實(shí)現(xiàn)了不同的功能------這就是所謂的操作符重載(嘿嘿,我說(shuō)你一定見(jiàn)過(guò)吧:)!不就好像是漢語(yǔ)中的一詞多意一樣!我需要說(shuō)明一下的是,C++中的操作符重載可沒(méi)有這么簡(jiǎn)單。比如,我們可以對(duì)兩個(gè)自定義類型的對(duì)象進(jìn)行相加的運(yùn)算,進(jìn)行賦值的運(yùn)算。這樣書(shū)寫(xiě)簡(jiǎn)潔明了,而且非常實(shí)用。當(dāng)然,關(guān)于操作符重載的話題太多了,有興趣再看看書(shū)吧!
我們把操作符的話題在轉(zhuǎn)到函數(shù)上來(lái),我們一直強(qiáng)調(diào)的是“對(duì)象調(diào)方法”------對(duì)象其實(shí)調(diào)的是方法的“名稱”。而我們現(xiàn)在要對(duì)方法進(jìn)想重載,也就是定義多個(gè)相同名稱的函數(shù),這樣計(jì)算機(jī)在調(diào)用的時(shí)候不會(huì)混淆嘛?我想應(yīng)該不會(huì)的,呵呵,因?yàn)閮H僅是函數(shù)名稱相同,而我們?cè)谡{(diào)用函數(shù)時(shí)會(huì)把參數(shù)傳遞給他的。既是沒(méi)有參數(shù)也是一種參數(shù)傳遞參數(shù)的信息(信息為無(wú)參數(shù))!然而由于參數(shù)類型、參數(shù)數(shù)量、返回值類型不同我們就可以對(duì)相同名稱的函數(shù)進(jìn)行區(qū)分了!目的只有一個(gè),用簡(jiǎn)便的方法實(shí)現(xiàn)更多的功能。還是舉個(gè)例子吧,重載構(gòu)造函數(shù)!
public class employee{ 數(shù)
}
public employee(){ //請(qǐng)注意這個(gè)函數(shù)沒(méi)有參數(shù) name = n;//設(shè)置員工姓名 age = a;//設(shè)置員工年齡 sex = s;//設(shè)置員工性別 emolument = e;//設(shè)置員工薪水 lunch =l;//設(shè)置員工午餐 public employee(String n,int a,char s,float e,boolean l){ //看這個(gè)構(gòu)造函
} name = “jw”;age = 20;sex = ’W’;emolument = 99;lunch = true
//??等等
};
看,在一個(gè)類中有兩個(gè)名稱相同的函數(shù),可我們?cè)谑褂玫臅r(shí)候系統(tǒng)如何知道我們調(diào)用的是那個(gè)版本的函數(shù)呢?呵呵,我剛剛說(shuō)過(guò)了,可以通過(guò)函數(shù)的參數(shù)類型、參數(shù)數(shù)量、返回值類型來(lái)確定。現(xiàn)在我們接著試驗(yàn),我們創(chuàng)建兩個(gè)對(duì)象其中的一個(gè)調(diào)用帶參數(shù)的構(gòu)造函數(shù),第二個(gè)對(duì)象調(diào)用缺省值的構(gòu)造函數(shù)。我們來(lái)看看結(jié)果:
jingwei = new employee(“jingwei”,20,'M',100,false);/*創(chuàng)建這個(gè)對(duì)象的時(shí)候調(diào)用的是帶參數(shù)的構(gòu)造函數(shù)*/ flashmagic = new employee();//創(chuàng)建這個(gè)對(duì)象是調(diào)用的是卻省值的構(gòu)造函數(shù) 而得到的結(jié)果呢?讓我們一起來(lái)看一看!
Jingwei這個(gè)對(duì)象中: flashmagic這個(gè)對(duì)象中: name jingwei name jw age 20 age 20 sex M sex W emolument 100 emolument 99 lunch false lunch true 看,雖然是兩個(gè)名稱完全相同的函數(shù),但完成了不同的工作內(nèi)容。呵呵!關(guān)于函數(shù)重載我們就料到這里吧,我相信你已經(jīng)有個(gè)大印象了,而更詳細(xì)的內(nèi)容仍需要你的努力!重載普通的函數(shù)與重載構(gòu)造函數(shù)大同小異,不過(guò)他多了一個(gè)this指針!this一般是對(duì)當(dāng)前對(duì)象的引用。這么說(shuō)吧,如果涉及到兩個(gè)以上的對(duì)象時(shí)就會(huì)使用this指針。每個(gè)成員函數(shù)都有一個(gè)this指針,它是一個(gè)隱藏的參數(shù),this指針只向調(diào)用它的對(duì)象!我說(shuō)過(guò)方法只有一份,而對(duì)象都有自己的屬性,當(dāng)對(duì)象調(diào)用方法來(lái)先是屬性的時(shí)候,他怎么來(lái)判斷調(diào)用的時(shí)不是自己的屬性呢?這就需要this指針來(lái)大顯神威了。
關(guān)于拷貝構(gòu)造函數(shù)、內(nèi)聯(lián)函數(shù)、虛函數(shù)、模版等歐就不做過(guò)多的討論了,因?yàn)镴AVA中好像沒(méi)有這些了。不過(guò)我需要提醒你一下的是,在C++中,類內(nèi)定義的函數(shù)自動(dòng)轉(zhuǎn)換為內(nèi)聯(lián)函數(shù),而這好像與我前面提到的思想有沖突。因?yàn)閮?nèi)聯(lián)函數(shù)的目的是減少函數(shù)調(diào)用的開(kāi)銷!呵呵!我也沒(méi)繞出來(lái)呢!還請(qǐng)哪為大蝦指點(diǎn)一二!謝!
2.3.3 初始化與賦值
這里我卻要提醒你一下的是,初始化與賦值是完全不同的兩個(gè)概念。創(chuàng)建一個(gè)類的時(shí)候會(huì)調(diào)用這個(gè)類的構(gòu)造函數(shù)對(duì)對(duì)象的屬性進(jìn)行初始化。而如果以后再把這個(gè)對(duì)象賦給其他同類型的對(duì)象時(shí)可就沒(méi)那么簡(jiǎn)單了。在JAVA中直接賦值就行了,因?yàn)镴AVA中取消了指針,不存在指針的深拷貝與前拷貝問(wèn)題。而在C++中就需要拷貝構(gòu)造函數(shù)以及操作符重載了。因?yàn)镴AVA中不牽扯這些東西,所以偶就不做過(guò)多介紹了。詳情請(qǐng)參閱相關(guān)書(shū)籍吧!
2.3.4析夠函數(shù):
JAVA中不再支持指針了,所以你感覺(jué)不到它的重要性,因?yàn)橄到y(tǒng)會(huì)自動(dòng)為你釋放內(nèi)存。而在C++中一切都是手動(dòng)的。在構(gòu)造函數(shù)中new了一個(gè)指針,在析夠函數(shù)中就要delete這個(gè)指針。
2.3.5靜態(tài):
現(xiàn)在我們?cè)賮?lái)看一看“靜態(tài)”是咋一回事兒!
把一個(gè)變量或函數(shù)聲明為靜態(tài)的需要“static”這個(gè)關(guān)鍵字。聲明靜態(tài)的目的是“為某個(gè)類的所有對(duì)象的某個(gè)屬性或方法分配單一的存儲(chǔ)空間”。靜態(tài)的數(shù)據(jù)是屬于類的,不屬于任何的對(duì)象。靜態(tài)的數(shù)據(jù)在聲明的時(shí)候系統(tǒng)就為他分配了內(nèi)存空間,而不用等到創(chuàng)建對(duì)象時(shí)。舉個(gè)例子來(lái)幫你更好的理解它吧。
還是接著上面的例子。還記得剛剛我說(shuō)過(guò)的員工能用微波爐熱飯的事情吧?,F(xiàn)在我們要找一個(gè)手套,畢竟想把熱好的飯從微波爐里拿出來(lái)直接下手是不行的。我把手套定義成一個(gè)布爾型的變量,它有干凈和臟兩種狀態(tài)。想想看手套是屬于誰(shuí)的?所有對(duì)象?不對(duì)!因?yàn)橹挥蟹椒ú拍軐儆谒械膶?duì)象。它是屬于類的,它像微波爐那個(gè)方法一樣,在內(nèi)存中只有一份,所有的對(duì)象通過(guò)方法都能夠修改它。而下一次修改是基于上一次修改的基礎(chǔ)之上的!我的意思是:一個(gè)員工把手套弄臟了,下一個(gè)員工在使用的時(shí)候它還是臟的。而這個(gè)員工把手套洗干凈之后,別人再用的時(shí)候它就是干凈的了!就這么點(diǎn)事兒,明白了吧!關(guān)于靜態(tài)函數(shù)我想就沒(méi)什么可多說(shuō)的了。給我的感覺(jué)就是,它也是屬于類的,在定義的時(shí)候就分配的內(nèi)存。調(diào)用是可以使用類名直接調(diào)用。其他的和普通成員函數(shù)沒(méi)什么不同的了不過(guò)這里需要說(shuō)明的一點(diǎn)是:在JAVA中,靜態(tài)的成員函數(shù)只能修改靜態(tài)的屬性,而靜態(tài)的屬性可以被所有的成員函數(shù)修改。不過(guò)在C++中就沒(méi)這么多事兒了!
2.4繼承
繼承很好理解,它的最大好處就是“代碼重用”,大大提高了工作效率。舉個(gè)例子你就明白了。世界上先有的黑白電視機(jī),它有自己的工作原理。然而人們?cè)谒幕A(chǔ)之上開(kāi)發(fā)出了彩色電視機(jī)。彩色電視機(jī)繼承了黑白電視機(jī)的所有的特性與方法!因?yàn)樗饶茱@示彩色圖像也能顯示黑白圖像。然而它與黑白電視機(jī)又有許多區(qū)別,在工作原理上。彩色電視及多了矩陣色電路,把彩色信號(hào)分離出三種顏色(RGB),他就能顯示彩色的圖像了。而黑白電視機(jī)沒(méi)有這塊電路,即使它收到了彩色信號(hào)也顯示不了彩色圖像。彩色電視機(jī)是從黑白電視機(jī)中派生出來(lái)的。所以,黑白電視機(jī)是父類,彩色電視既是子類,彩色電視繼承了黑白電視機(jī)所有的特性與方法??纯丛儆?jì)算機(jī)中它是什么樣子的吧:
//BWtv.java 父類的定義 public class BWtv{
private int a;public BWtv(){ } public changeBWtv(int i){ } } //Ctv.java 子類的定義
class Ctv exntends BWtv{ //注意關(guān)鍵字“extends”
private int b;public Ctv(){ b=2;a=i;a=1;
} } public changetCv(int x){ } b = x;有了上面的定義,我們來(lái)看看他們都有什么數(shù)據(jù)。
BWtv的數(shù)據(jù)包括 Ctv的數(shù)據(jù)包括 private int a private int a
private int b public changeBWtv();public changeBWtv()
public changeCtv();你看,子類擁有父類的所有的方法及屬性。注意關(guān)鍵字”extends”,它的意思是繼承。在C++中使用的是“:”操作符。意思是一樣的。但是這里有許多問(wèn)題,首先是訪問(wèn)權(quán)限的問(wèn)題,子類的對(duì)象擁有父類的所有的屬性和方法這句話。對(duì)嘛?肯定是對(duì)的?。ú贿^(guò)JAVA的書(shū)中可不是這么說(shuō)的,他說(shuō)只繼承非private類型的屬性及方法,我覺(jué)得它這句話有錯(cuò)誤!)可是,子類的對(duì)象不能直接訪問(wèn)父類的私有屬性或方法,它只能通過(guò)父類的公有成員函數(shù)來(lái)訪問(wèn)。而此時(shí),如果你修改了父類的屬性的值。那就真的修改了。我的意思是:父類的私有屬性的值會(huì)隨著子類對(duì)象調(diào)用父類的公有方法進(jìn)行對(duì)相應(yīng)屬性的修改而發(fā)生變化?。ㄟ@里面存在一個(gè)域的問(wèn)題,所有的修改都是在子類中進(jìn)行的,修改的是子類繼承的父類的屬性(在子類這個(gè)域中,此時(shí)父類以拷貝到子類中了。)。而程序中定義的父類的屬性不會(huì)發(fā)生任何變化(在父類的域中),)
其次是構(gòu)造函數(shù),在創(chuàng)建一個(gè)子類對(duì)象時(shí)首先要調(diào)用的是父類的構(gòu)造函數(shù),然后再調(diào)用子類的構(gòu)造函數(shù),畢竟,子類的構(gòu)造函數(shù)不包括父類的屬性的初始化功能!(從這一點(diǎn)來(lái)說(shuō)我的觀點(diǎn)又是正確的“子類的對(duì)象擁有父類的所有的屬性和方法”)當(dāng)然了,析夠函數(shù)的調(diào)用順序正好相反!
現(xiàn)在讓我們來(lái)談?wù)刾rotected這個(gè)關(guān)鍵字吧,它的意思是:對(duì)對(duì)象來(lái)說(shuō),聲明為protected的變量是私有的,而對(duì)子類父類來(lái)說(shuō),聲明為protected的變量是公共的。
現(xiàn)在又出現(xiàn)了這樣的一個(gè)問(wèn)題,如果我們?cè)谧宇愔幸捕x了一個(gè)int 類型的變量a,那我們?cè)趧?chuàng)建子類的對(duì)象的時(shí)候調(diào)用的是子類定義的還是父類定義的呢?這就涉及到數(shù)據(jù)的隱藏的問(wèn)題了,我可以告訴你肯定是調(diào)用的子類的變量a。因?yàn)椋宇惏迅割惖倪@個(gè)同名變量給隱藏了。而如果是方法呢?這就涉及到重構(gòu)的問(wèn)題了,在上面我提到過(guò)“函數(shù)重構(gòu)是指在子類中聲明與父類同名的方法,從而覆蓋了父類的方法。重構(gòu)解決了子類與父類的差異問(wèn)題。”這里必須要聲明一下的是,在JAVA中,子類出現(xiàn)了對(duì)父類屬性的隱藏和父類方法的覆蓋后,在子類中,子類對(duì)象僅能調(diào)用子類本身的屬性和方法。要調(diào)用父類的屬性和方法必須要實(shí)用super這個(gè)關(guān)鍵子。而在C++中就不這樣了。因?yàn)樗刑摵瘮?shù)
虛擬函數(shù)在C++中非常好玩的事。我們可以把需要改寫(xiě)的函數(shù)聲明為虛函數(shù),用virtual這個(gè)關(guān)鍵字來(lái)聲明。這樣。假如如果我們CwinApp這么一個(gè)基類,它里面定義了一個(gè)成員(虛)函數(shù)為InitInstance()和另一個(gè)為(虛)函數(shù)InitApplication()。如果我從CWinApp派生一個(gè)子類為CMyWinApp并修改了InitInstance()這個(gè)成員函數(shù)。我們并沒(méi)有修改InitApplication()這個(gè)成員函數(shù)。現(xiàn)在我們創(chuàng)建CMyWinApp這個(gè)類的函數(shù)theApp,我們并創(chuàng)建一個(gè)指針*pApp指向這個(gè)對(duì)象theApp。此時(shí):
pApp->InitInstance()//指針調(diào)用的是子類CMyWinApp的虛方法 pApp->InitApplication()//指針調(diào)用的時(shí)父類CwinApp的虛方法
因?yàn)樽宇惒](méi)有修改父類的方法,所以調(diào)用的是父類的虛方法。這就牽扯到虛你表的問(wèn)題。礙與本篇文章的定位,這里就不討論了!
關(guān)于父類與子類的對(duì)象的類型轉(zhuǎn)換問(wèn)題是這樣的,子類對(duì)象轉(zhuǎn)換為父類對(duì)象時(shí),不會(huì)出現(xiàn)錯(cuò)誤。因?yàn)樽宇惏割惖乃械膶傩约胺椒ǎ割愊蜃宇愞D(zhuǎn)換時(shí)就難說(shuō)了,呵呵。這還會(huì)牽扯到虛擬表的問(wèn)題,也不討論了!
JAVA中不再支持多重繼承,也就是一個(gè)類從兩個(gè)以上的類中繼承而來(lái),但它卻多了接口的概念“interface”。這里就不做過(guò)多介紹了!
關(guān)于抽象基類也沒(méi)什么難的!他的一個(gè)大概念就是:做為許多類的父類,不定義對(duì)象,只做派生用!
我能做得也只有這些了,如果你能明白以上的六七成,那就是對(duì)我最大的回報(bào)了,呵呵!就像剛剛開(kāi)始我說(shuō)的,我只是給你一個(gè)大概的思想,至于內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),仍需要你的繼續(xù)努力。關(guān)于編程語(yǔ)言的內(nèi)容還有許多許多,實(shí)屬小生個(gè)人能力有限而不能全盤(pán)照顧到。不過(guò)作為一個(gè)初學(xué)者的你來(lái)說(shuō),這些東西都是基本的。需要我提醒你一點(diǎn)的是,不要指望在第一、二遍的時(shí)候看懂什么!加油:)