国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java入門(2) 面向?qū)ο蟮某绦蛟O(shè)計(jì)
Java入門(2) 面向?qū)ο蟮某绦蛟O(shè)計(jì)
摘要

  通過本章的學(xué)習(xí),讀者應(yīng)對(duì)“面向?qū)ο蟆钡某绦蛟O(shè)計(jì)有一個(gè)整體的認(rèn)識(shí),理解一些相關(guān)的術(shù)語,為學(xué)習(xí)Java語言編程打下基礎(chǔ)。

(2002-08-29 14:07:43)

By Wing, 出處:fjxufeng

  本章目標(biāo):

  通過本章的學(xué)習(xí),讀者應(yīng)對(duì)“面向?qū)ο蟆钡某绦蛟O(shè)計(jì)有一個(gè)整體的認(rèn)識(shí),理解一些相關(guān)的術(shù)語,為學(xué)習(xí)Java語言編程打下基礎(chǔ)。

  2.1 什么是面向?qū)ο蟮某绦蛟O(shè)計(jì)

  最早的程序設(shè)計(jì)工作,是直接使用機(jī)器碼進(jìn)行編程的,要利用計(jì)算機(jī)完成一件事,就得畫上無數(shù)個(gè)0和1,編程不僅需要知識(shí),還需要足夠的耐心。第一代程序員們都是這樣完成程序編寫的,程序出錯(cuò)時(shí),就不得不在眾多的0與1之間尋尋覓覓,真的就象是在找蟲子呀(Bug,表示錯(cuò)誤)。這樣的工作方法不僅需要花費(fèi)大量的時(shí)間,還得付出不菲的金錢,不過這對(duì)于當(dāng)時(shí)天價(jià)的計(jì)算機(jī)來說,是微不足道的。

  隨著計(jì)算機(jī)應(yīng)用的不斷增多,軟件開發(fā)任務(wù)也與日俱增。這時(shí)直接使用機(jī)器碼來編程已經(jīng)無法應(yīng)付需要。這時(shí)匯編語言誕生了,它使用一些類似MOV、ADD、SUB等助記符來代替一長(zhǎng)串0和1。我們先使用這樣的語言寫出源程序,再用匯編程序?qū)⑺鼈兎g成為機(jī)器可以運(yùn)行的機(jī)器碼,這樣使得軟件開發(fā)變得更簡(jiǎn)單一些了。

  人類總是“發(fā)明工具”、“使用工具”、“完善工具”、“再使用”、“再完善”,循序漸進(jìn),不斷地向前發(fā)展。使用匯編語言提高了軟件開發(fā)的效率,但人類并未滿足,又在匯編語言的基礎(chǔ)上發(fā)展了更貼近人類語言的高級(jí)語言,如BASIC、Fortran、Cobol、C等。

  在高級(jí)語言出現(xiàn)時(shí),計(jì)算機(jī)已經(jīng)逐漸普通,正在以“摩爾定律”高速發(fā)展(計(jì)算速度越來越快,價(jià)錢越來越低),計(jì)算機(jī)的價(jià)格已不再是制約計(jì)算機(jī)應(yīng)用的關(guān)鍵因素。人類需要大量的計(jì)算機(jī)軟件來提高計(jì)算機(jī)的應(yīng)用水平。而在這個(gè)時(shí)代,計(jì)算機(jī)硬件已經(jīng)進(jìn)入了有序、產(chǎn)業(yè)化的發(fā)展,但計(jì)算機(jī)軟件卻曾一度陷入失控的狀態(tài)。如何讓計(jì)算機(jī)軟件更加可控制,可管理成為了一個(gè)十分重要的課題。

  小知識(shí):

  在這個(gè)時(shí)代曾經(jīng)暴發(fā)了一場(chǎng)“軟件危機(jī)”,許多重要的軟件項(xiàng)目都陷入失控的狀態(tài),如何使得軟件項(xiàng)目勝利的完成,成為整個(gè)產(chǎn)業(yè)最為頭痛的一個(gè)問題。曾經(jīng)有一本著名的書籍《神秘的人月》將這描寫成為:“失控的軟件項(xiàng)目就象陷入泥潭的駱駝,越掙扎就陷得越深”。有興趣的讀者可以閱讀一些相關(guān)的書籍。

  這一切“創(chuàng)就”了一門新的學(xué)科:《軟件工程學(xué)》,將軟件開發(fā)工作分成了“系統(tǒng)分析”、“設(shè)計(jì)”、“編程”、“測(cè)試”、“維護(hù)”等幾個(gè)組成部分,一改以往“軟件開發(fā)就是寫程序”的認(rèn)識(shí)。原來,軟件開發(fā)工作就是充分發(fā)揮程序員的聰明才智解決問題,正如一句俗話所說的:“不管黑貓白貓,能逮著老鼠就是好貓”,在軟件開發(fā)中,曾經(jīng)奉行著一句矢志不渝的真理“只要能夠解決問題的程序就是好程序”。這樣,寫出來的程序別說別人看不懂,有時(shí)連自己一段時(shí)間后都看不懂自己的程序了。試想,這樣如何能夠集眾人力量共同完成一個(gè)軟件項(xiàng)目呢,如何能夠?qū)σ粋€(gè)軟件項(xiàng)目提供有效的維護(hù)呢?

  通過了一段時(shí)間的摸索后,就形成了一套大家都很熟悉的面向過程的“結(jié)構(gòu)化”軟件方法學(xué),包括結(jié)構(gòu)化設(shè)計(jì)、結(jié)構(gòu)化編程等軟件開發(fā)方法學(xué)。如果大家在閱讀這本書之前,有一些程序設(shè)計(jì)的經(jīng)驗(yàn)的話,對(duì)這個(gè)應(yīng)該還是有一些了解的。為了能夠讓大家理解“結(jié)構(gòu)化”編程與我們?cè)谶@里要說明的“面向?qū)ο蟆钡某绦蛟O(shè)計(jì)的區(qū)別,在此我就用“偽代碼”寫一段程序(在本例中,我主要是用于講解語法,而不考慮本程序是否有現(xiàn)實(shí)作用)。

  偽代碼:

  偽代碼,是指不能夠直接編譯運(yùn)行的程序代碼,它是用于語法結(jié)構(gòu)講解的一個(gè)工具,它比真正的程序代碼更簡(jiǎn)明,更貼近自然語言。

  源程序:一個(gè)“結(jié)構(gòu)化”程序示例:

  鉛筆數(shù)=5

  鋼筆數(shù)=6

  圓珠筆數(shù)=4

  其它筆數(shù)=7

……// 銷售程序段鉛筆數(shù)=鉛筆數(shù)-1 // 賣出了1支鉛筆其它筆數(shù)=其它筆數(shù)-2 // 賣出了2支其它筆// 采購(gòu)程序段鋼筆數(shù)=鋼筆數(shù)+20 // 新進(jìn)了20支鋼筆圓珠筆數(shù)=圓珠筆數(shù)+10 // 新進(jìn)了10支圓珠筆……

  正如上面的程序段所示,在結(jié)構(gòu)化的程序我們通常是:

  1) 定義變量及其初始值;

  2) 根據(jù)事件發(fā)展順序,進(jìn)行相對(duì)應(yīng)的處理。

  在上面的程序中,我們先定義了各種筆的初始總數(shù),然后這些數(shù)量會(huì)在銷售、采購(gòu)時(shí)改變。這種程序的編寫思路是隨著事件,按照一定的過程來進(jìn)行的。這種方法是一種“解題”的思維方式,把所有的需求,當(dāng)作一個(gè)“應(yīng)用題”一樣來“解答”。

  可以看出,從機(jī)器語言、匯編語言到高級(jí)語言,程序設(shè)計(jì)越來越貼近人類的語言,但是它們又都有一個(gè)通病,就是它們都需要程序使用機(jī)器的思路,而不是人的思路,為什么這么說呢?那么人的思路是什么呢??

  人類認(rèn)識(shí)世界的思路總是針對(duì)一個(gè)個(gè)具體的客觀事物來認(rèn)識(shí),包括它的形狀、大小等屬性,以及行為、功能、動(dòng)作等。就象一說到貓,就馬上知道它是4只腳的、“喵喵”叫的,而且貓的行為動(dòng)作大家也很熟悉,比如,我們說“貓抓老鼠”,大家應(yīng)該馬上就會(huì)在腦海中出現(xiàn)一個(gè)相應(yīng)的圖象吧。

  這時(shí),人們突然發(fā)現(xiàn),如果編寫程序也采用這樣的思維的話,那么將使得程序更加清晰,寫起程序來也會(huì)變得更加簡(jiǎn)單了。軟件工程學(xué)家便開始了堅(jiān)持不懈的研究,終于創(chuàng)建了“面向?qū)ο蟆狈椒▽W(xué),這一方法學(xué)的出現(xiàn),使得軟件工程又向前邁了一大步了?!懊嫦?qū)ο蟆狈椒▽W(xué)其實(shí)包括:“面向?qū)ο蟮南到y(tǒng)分析”、“面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)”、“面向?qū)ο蟮某绦蛟O(shè)計(jì)”……,而在本章中則主要探討“面向?qū)ο蟮某绦蛟O(shè)計(jì)”。

  一些提示:

  熟悉Visaul Basic的讀者,您應(yīng)該記得在使用VB開發(fā)程序時(shí),大家將一個(gè)個(gè)控件拖到界面上,然后修改它們的屬性,使它們符合程序的需要,接著在這個(gè)控件的相應(yīng)事件中填入代碼。您想想,這不想我們兒時(shí)玩的搭積木嗎,太簡(jiǎn)單了!這就是“面向?qū)ο蟆钡某绦蛟O(shè)計(jì)給我們帶來的好處呀。

  為了讓大家對(duì)“面向?qū)ο蟆钡某绦蛟O(shè)計(jì)有一些了解,我就再使用偽代碼寫一段代碼,僅供大家比較。

  源程序:一個(gè)“面向?qū)ο蟆钡某绦蚴纠?/p>

筆店{ 鉛筆; 鋼筆; 圓珠筆; 其它筆; 賣出(筆種類,數(shù)量) {筆種類=筆種類 - 數(shù)量; }進(jìn)貨(筆種類,數(shù)量){筆種類=筆種類 + 數(shù)量;}盤點(diǎn)(){打印 鉛筆; // 打印出當(dāng)前鉛筆的庫(kù)存量打印 鋼筆; // 打印出當(dāng)前鋼筆的庫(kù)存量打印 圓珠筆; // 打印出當(dāng)前圓珠筆的庫(kù)存量打印 其它筆; // 打印出當(dāng)前其它筆的庫(kù)存量 }}

  雖然,使用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法好象更繁瑣,但其邏輯結(jié)構(gòu)嚴(yán)謹(jǐn)、有序,十分益于理解,而且,這里的“筆店”還可以在其它程序中使用,將大大提高開發(fā)效率。

  2.2 面向?qū)ο蟮闹饕g(shù)語

  傳統(tǒng)的“面向過程”的方法學(xué)是把世界分成兩個(gè)部分,分別認(rèn)知:

  1) 數(shù)據(jù)(Data):用于描述各種狀態(tài)的數(shù)據(jù)結(jié)構(gòu);

  2)過程(Procedures):就是操作這些狀態(tài)數(shù)據(jù)的程序,有時(shí)也稱為“算法”。

  說得形象一些,它認(rèn)為數(shù)據(jù)是靜態(tài)的,不會(huì)自行改變的,而需要各種各樣的過程來改為數(shù)據(jù)。您還記得“數(shù)據(jù)結(jié)構(gòu)”+“算法”=程序,這一個(gè)偉大的等式嗎?這就是“面向過程”方法學(xué)的精髓。

  舉個(gè)例子,我們要將一塊木頭從目前的位置向北搬到距原地10米的地方,我們首先會(huì)定義一個(gè)表示木頭的數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)位置、質(zhì)量等狀態(tài)信息,然后再編寫一個(gè)算法操作這個(gè)表示木頭的數(shù)據(jù)結(jié)構(gòu),以達(dá)到目的。

  而“面向?qū)ο蟆钡姆椒▽W(xué)則認(rèn)為世界是由各種各樣的對(duì)象(object)組成的,而每一個(gè)對(duì)象都有兩個(gè)特征:狀態(tài)(也稱為屬性)與行為(也稱為方法)。

  說得形象一些,每個(gè)組成世界的對(duì)象都是通過自己的行為來變化自身的狀態(tài),一切變化都是對(duì)象自身、或?qū)ο箝g的協(xié)調(diào)而產(chǎn)生的。

  2.2.1 對(duì)象

  而上面那個(gè)例子如果使用“面向?qū)ο蟆钡慕嵌葋砜?,我們?huì)創(chuàng)建一個(gè)木頭對(duì)象,這個(gè)對(duì)象不僅包括所有的屬性、狀態(tài)信息,還包括對(duì)它行為的描述。

  然后,我們讓它執(zhí)行一個(gè)自己的行為,使其發(fā)生相應(yīng)的變化。這種方法更加符合自然世界,更加符合人類的思維習(xí)慣。

  也就是說,對(duì)象是一種對(duì)客觀事物的抽象,它由狀態(tài)(屬性)和行為(方法)組成。

  下面,我們就使用一個(gè)圖,來幫助大家認(rèn)識(shí)對(duì)象。正如圖2-1所示,我們使用一個(gè)大圓來表示一個(gè)對(duì)象,中間的一個(gè)小圓圈定義了這個(gè)對(duì)象的各種狀態(tài)信息,外面則是各種各樣的行為,通過執(zhí)行這個(gè)對(duì)象的行為,就會(huì)改變這個(gè)對(duì)象的狀態(tài)。

  圖2-1 木頭對(duì)象示意圖

  2.2.2 類(Class)

  在真實(shí)世界中,通常有許多對(duì)象具有相同的性質(zhì)。如你家的貓,只是世界上所有家貓中的一只;你家的電腦,只是世界上所有電腦中的一臺(tái)……。這些貓、電腦……都具有類似的功能、相似的屬性,但卻又不是完成一樣的。

  這在面向?qū)ο蟮母拍罾?,把“貓”、“電腦”……等稱為“類”,而“你家的貓”、“你家的電腦”則是這個(gè)類的一個(gè)具體的實(shí)例,一個(gè)對(duì)象。

  也就是說,類是一個(gè)集合,一個(gè)模板,通常我們?cè)谑褂妹嫦驅(qū)ο蟮某绦蛟O(shè)計(jì)中,我們是先定一個(gè)類,然后用類去定義一個(gè)對(duì)象,這個(gè)對(duì)象就可以使用了。

  還記得在2.1小節(jié)里,我們舉的那個(gè)例子嗎?我們首先定義了“筆店”這個(gè)類,它擁有4個(gè)屬性:

  1) 鉛筆;

  2) 鋼筆;

  3) 圓珠筆;

  4) 其它筆

  同時(shí)還定義了三個(gè)行為:

  1)賣出:將屬性的值減少,表示賣出;

  2)進(jìn)貨:將屬性的值增加,表示進(jìn)貨;

  3)盤點(diǎn):打印出屬性的值;

  接著,我們?cè)谥骱瘮?shù)中,先定義了一個(gè)屬于“筆店”的對(duì)象:“張三筆店”,然后就可以對(duì)這個(gè)對(duì)象進(jìn)行操作了。

  可以看出,類與對(duì)象的定義是一樣的:狀態(tài)(屬性)+行為(方法)。因?yàn)轭愂菍?duì)象的超集嘛。我們可以對(duì)類下一個(gè)定義:

  類是由所有相似對(duì)象的狀態(tài)變量(屬性變量)與行為(方法)所構(gòu)成的模板或原型。

  2.2.3 封裝性

  我們知道,對(duì)于一個(gè)對(duì)象來說,要改變自身的狀態(tài)就意味著發(fā)生了行為。換一句話說,只有調(diào)用屬于對(duì)象自己的行為才能改變自己的狀態(tài)信息。

  在面向?qū)ο蟮某绦蛟O(shè)計(jì)語言中,您必須遵循這一原則,而且語言本身就提供了這樣的機(jī)制,使得你不可能不遵循。這種機(jī)制稱為“封裝性”。

  從軟件工程學(xué)的角度來看,這種封裝性有效地將對(duì)象的狀態(tài)數(shù)據(jù)隱藏起來,符合信息隱蔽原則,能夠有效地避免因過失而破壞了狀態(tài)數(shù)據(jù)。

  2.2.4 消息傳遞(Message)

  在前面,我們說到在面向?qū)ο蟮氖澜缰?,一切變化都是?duì)象自身、或?qū)ο箝g的協(xié)調(diào)而產(chǎn)生的。那么它們是如何進(jìn)行協(xié)商的呢?

  在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,我們采用一種叫消息傳遞(Message Passing)的機(jī)制來實(shí)現(xiàn)。消息從一個(gè)對(duì)象發(fā)到另一個(gè)對(duì)象,使另一個(gè)對(duì)象完成某一個(gè)行為。

  通常,我們把發(fā)送消息的對(duì)象稱為“發(fā)送對(duì)象”(sender),而把接受消息的對(duì)象稱為“接受對(duì)象”(receiver)。其工作如下圖所示:

  圖2-2 消息傳遞機(jī)制工作示意圖

  舉一個(gè)我們身邊的例子,在使用Windows 98時(shí),我們可以在不同的對(duì)象上按鼠標(biāo)右鍵,就會(huì)出現(xiàn)這個(gè)對(duì)象的屬性菜單。例如,在桌面上按右鍵,就會(huì)出現(xiàn)桌面的屬性菜單;如果在“網(wǎng)絡(luò)鄰居”圖標(biāo)上按右鍵的話,就會(huì)出現(xiàn)網(wǎng)絡(luò)屬性菜單……

  這就是通過消息傳遞來實(shí)現(xiàn)的,在Windows 98中,當(dāng)我們單擊鼠標(biāo)右鍵時(shí),“鼠標(biāo)驅(qū)動(dòng)程序”(一個(gè)對(duì)象)就會(huì)獲取這個(gè)動(dòng)作,然后向“系統(tǒng)”詢問當(dāng)前位置是什么對(duì)象,假設(shè)是“網(wǎng)絡(luò)鄰居”圖標(biāo),那么它就向“網(wǎng)絡(luò)鄰居”這個(gè)圖標(biāo)(也是一個(gè)對(duì)象)發(fā)出一個(gè)消息,讓其顯示出屬性菜單。

  Windows就是一個(gè)使用面向?qū)ο笤O(shè)計(jì)實(shí)現(xiàn)的,它采用了消息驅(qū)動(dòng)機(jī)制,大家一定會(huì)記得,我們從開始菜單關(guān)機(jī)時(shí),一些本來打開的程序在關(guān)機(jī)前先關(guān)閉,這都是消息機(jī)制的作用,在關(guān)機(jī),系統(tǒng)向每一個(gè)運(yùn)行著的“對(duì)象”傳送了一個(gè)消息,使其關(guān)閉。

  2.2.5 繼承

  在前面我們說過,對(duì)象是由類產(chǎn)生的,因此我們就可以通過對(duì)類的認(rèn)識(shí)而了解對(duì)象。例如,假設(shè)你不知道“的士”是什么東西,我們只要說,“的士”是一種汽車,我想你馬上就會(huì)知道個(gè)大概!而如果,我再進(jìn)一步說明它是小轎車的話,你就會(huì)更明白了。

  到此,我們總結(jié)出一個(gè)道理,在現(xiàn)實(shí)世界中,有一些類比較大,可以分為許多小類,類是可以由其它的已知類來定義的。

  例如,汽車中有貨車、客車、轎車……:

  1) 用于運(yùn)輸貨物的汽車叫貨車;

  2) 用于運(yùn)輸旅客的汽車叫客車;

  3) 豪華的、較低矮、較小的、有錢人(:-P)做的汽車叫轎車。

  而汽車、貨車、客車、轎車都是類!在本例中,汽車這個(gè)類是貨車、客車、轎車這三個(gè)類的超類(Superclass),而貨車、客車、轎車這三個(gè)類則是汽車這個(gè)類的子類(subclass)。

  這四個(gè)類的關(guān)系,可以通過下面這個(gè)圖來表示:

  圖2-3 超類與子類

  如果定義了超類,那么子類就可以直接將超類中定義的狀態(tài)、行為繼承過來,不再需要另外定義了。因?yàn)檫@些屬性子類也是具備的。

  而子類之所以成為子類,是因?yàn)樗鼈兿鄬?duì)于超類而言,還有一些不同的地方,這需要增加一些屬性、行為。

  還用一些子類需要對(duì)繼承過來的超類進(jìn)行一些局部的修改,使其更能真實(shí)子類的特性。

  在現(xiàn)實(shí)世界中,繼承是可以多重的,也就是說一個(gè)子類可以同時(shí)擁有多個(gè)超類。而畢竟程序設(shè)計(jì)的世界并一定要完全一樣。在這個(gè)問題上,面向?qū)ο蟮难芯空邆冇蟹制纾幸徊糠秩苏J(rèn)為應(yīng)該采用單一的繼承,而有另一部分人則認(rèn)為應(yīng)該采用多重繼承。后來就在不同的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言中體現(xiàn)出來了:

  1) 在C++語言中,支持多重繼承;

  2) 在Java、Smalltalk、Objective-C都不支持多重繼承。

  為什么要引入繼承的概念呢?

  1)繼承機(jī)制提高了“軟件可復(fù)用性”。大家應(yīng)該知道,在結(jié)構(gòu)化的程序設(shè)計(jì)中,我們常常將一些經(jīng)常要使用的功能模塊寫成子程序,供程序調(diào)用,這樣會(huì)大大提高開發(fā)效率。這也就是“軟件復(fù)用”。

  而通過繼承,我們可以在已定義類的基礎(chǔ)上無限地繁衍出更多的類,并且通過直接繼承、新增、局部修改來重復(fù)使用超類。這樣必將使軟件開發(fā)的速度更快,同時(shí)可以使程序共享成為可能。

  共享代碼:

  通過共享代碼,我們就可以繼承他人寫的或系統(tǒng)提供的類,直接使用現(xiàn)成的程序碼并可以加以改寫,擴(kuò)展成為我們需要的東西。例如在Java中,窗口類已由Java的開發(fā)工具提供了,因?yàn)槲覀円鲆粋€(gè)窗口時(shí)就無須重寫寫過,只需直接使用就可以了。

  2)繼承機(jī)制的另一個(gè)好處在于它使得接口更加一致。

  當(dāng)超類衍生出許多的子類時(shí),它的行為接口通過繼承,也傳給了所有的子類。這樣,做消息傳遞時(shí),就無需關(guān)心每個(gè)子類的接口,它們都是一致的。

  2.2.6 小結(jié)

  面向?qū)ο蠓椒▽W(xué)博大、深?yuàn)W,絕不是通過以上這些只言片語能夠說得清楚的,在此只能是做一些簡(jiǎn)單的介紹,讓大家對(duì)其有一個(gè)基本的了解,以便更好地學(xué)習(xí)Java語言。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
面向?qū)ο筌浖y(cè)試與傳統(tǒng)測(cè)試的不同之處
科普文,面向?qū)ο蟪绦蛟O(shè)計(jì),要知道的那點(diǎn)事
java學(xué)習(xí)——理解面向?qū)ο蟪绦蛟O(shè)計(jì)
java基礎(chǔ)知識(shí)(五)
最好的C#入門教程程序設(shè)計(jì)
C++入門到精通:面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承與派生!
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服