java語言程序設(shè)計(第二版).ppt
《java語言程序設(shè)計(第二版).ppt》由會員分享,可在線閱讀,更多相關(guān)《java語言程序設(shè)計(第二版).ppt(53頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第二章面向?qū)ο?OO)程序設(shè)計概念,參考書:BruceEckelThinkinginJava,程序設(shè)計的演變,機(jī)器語言匯編語言面向過程的語言和結(jié)構(gòu)化程序設(shè)計程序算法數(shù)據(jù)結(jié)構(gòu)(C)面向?qū)ο蟪绦蛟O(shè)計程序?qū)ο笙鬟f(Java,C+,C#),抽象的進(jìn)步,所有編程語言的最終目的都是提供一種“抽象”方法匯編語言是對基礎(chǔ)機(jī)器的少量抽象命令式語言(如FORTRAN,BASIC和C)是對匯編語言的一種抽象OOP是更高層的抽象,面向?qū)ο蟪绦蛟O(shè)計方法的來源,大英百科全書描述了人類在認(rèn)識和理解現(xiàn)實(shí)世界的過程中普遍運(yùn)用的三個法則:1、區(qū)分對象及其屬性,例如,區(qū)分一棵樹和樹的大小或它與其它對象的空間關(guān)系。2、區(qū)分整體對象及其組成部分。例如,區(qū)分一棵樹和樹枝。3、形成并區(qū)分不同對象的類。例如,形成所有樹的類和所有石頭的類,并區(qū)分它們。,面向?qū)ο蟪绦蛟O(shè)計方法的特征,(1)所有東西都是對象??蓪ο笙胂蟪梢环N新型變量;它保存著數(shù)據(jù),但可要求它對自身進(jìn)行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然后在程序中將其表達(dá)為一個對象。,(2)程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什么。為了向?qū)ο蟀l(fā)出請求,需向那個對象“發(fā)送一條消息”。更具體地講,可將消息想象為一個調(diào)用請求,它調(diào)用的是從屬于目標(biāo)對象的一個子例程或函數(shù)。,(3)每個對象都有自己的存儲空間,可容納其他對象?;蛘哒f,通過封裝現(xiàn)有對象,可制作出新型對象。所以,盡管對象的概念非常簡單,但在程序中卻可達(dá)到任意高的復(fù)雜程度。,(4)每個對象都有一種類型。根據(jù)語法,每個對象都是某個“類”的一個“實(shí)例”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能將什么消息發(fā)給它?”。,(5)同一類所有對象都能接收相同的消息。這實(shí)際是別有含義的一種說法,大家不久便能理解。由于類型為“圓”(Circle)的一個對象也屬于類型為“形狀”(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味著可讓程序代碼統(tǒng)一指揮“形狀”,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱為對象的“可替換性”,是OOP最重要的概念之一。,實(shí)體,抽象數(shù)據(jù)類型,類,對象,白馬非馬論,公孫龍是名家的代表人物,他最有名的辯論是“白馬非馬”的假說。一天,他牽一匹白馬出關(guān)被阻,公孫龍便以白馬非馬的命題與之辯論,守關(guān)的人辯不過他,公孫龍就牽著馬出關(guān)去了(或說,他還是不得出關(guān))。公孫龍說,白馬為非馬者,言白所以名色,言馬所以名形也;色非形,形非色也。夫言色則形不當(dāng)與,言形則色不宜從,今合以為物,非也。如求白馬于廄中,無有,而有驪色之馬,然不可以應(yīng)有白馬也。不可以應(yīng)有白馬,則所求之馬亡矣;亡則白馬竟非馬。公孫龍的話大意是說:馬指的是馬的形態(tài),白馬指的是馬的顏色,而形態(tài)不等于顏色,所以白馬不是馬。,其他聲音(論面向?qū)ο蠛徒Y(jié)構(gòu)化),1、許多人一談到結(jié)構(gòu)化,就非常不屑地說,那是過了時的東西,現(xiàn)在流行的是面向?qū)ο?等等.真的是這樣嗎?我認(rèn)為沒有,結(jié)構(gòu)化的設(shè)計思想并沒有消失,而是一直在頑強(qiáng)的生存著,以后也會生存下去.結(jié)構(gòu)化的思想和面向?qū)ο蟮乃枷胫皇强紤]同樣一個問題的兩個不同角度而已,他們本身并沒有那個好那個不好的問題,當(dāng)然具體到每個系統(tǒng)設(shè)計人員,就要受限制與自己所接受的教育,從而可能會有自己的判斷和喜好.我曾經(jīng)接觸過幾個老資格的程序員,他們在中國剛剛引進(jìn)計算機(jī)時就開始進(jìn)行大規(guī)模的軟件編程,他們對于系統(tǒng)的把握和理解確實(shí)是非常深刻的,盡管是結(jié)構(gòu)化的.系統(tǒng)分析本身的最終目的,是為了真正理解系統(tǒng),而采用那個角度,用那種方法來理解系統(tǒng)只是一個手段問題,不是根本問題.,2、不敢茍同,你沒有意識到兩者本質(zhì)上的不同,結(jié)構(gòu)化方法的缺陷(或者叫硬傷)使得它逐漸被淘汰,,3、我來打個比方,面向?qū)ο蠛徒Y(jié)構(gòu)化好比中醫(yī)和西醫(yī)一樣,只是兩種不同的理論體系一樣,但病人是一個,他們本質(zhì)上是不同的,但其處理的問題是一致的.難道中醫(yī)能看病,就意味著西醫(yī)不能看病嗎?請問,結(jié)構(gòu)化的缺陷何在?,4、“天圓地方”是足夠正確的,在人們沒有見到大海之前“地心說”是足夠正確的,在人們沒有感覺到行星軌道的復(fù)雜之前“日心說”是足夠正確的,在人們沒有感覺到更大星系的存在之前.牛頓力學(xué)是足夠正確的,在人們沒有計算超大尺度和超小尺度之前結(jié)構(gòu)化也是足夠的,在軟件開發(fā)不得不把“復(fù)用”、“構(gòu)件”擺在重要位置之前,5、老資格的結(jié)構(gòu)化程序員確實(shí)是面向?qū)ο笮率郑拖笏惚P老手速度比計算器新手快一樣,有的毛筆老手也會寫得比鋼筆新手快又好。,6、知不知道并不是有了超大超小之后,牛頓力學(xué)就不對了.你拿量子力學(xué)或者超弦理論來算火車什么時候到站估計永遠(yuǎn)得不出結(jié)果來.只有適用的才是最好的,沒有萬能藥用來打蒼蠅估計蒼蠅拍比原子彈更好.,7、如果你說的是世界觀,我同意OO和結(jié)構(gòu)化沒有優(yōu)劣之分,這屬于哲學(xué)范疇;但我想,我們是在討論技術(shù)和工程問題,在這一點(diǎn)上,無論理論還是實(shí)踐,OO是主流,勝于結(jié)構(gòu)化,也早有定論。市場已經(jīng)做出了回答。在這10年間新的軟件基本上都在用OO方法,而結(jié)構(gòu)化只被限制小范圍、某些特定的應(yīng)用上。我離開大學(xué)后就再也沒有接觸過結(jié)構(gòu)化,OO完全可以取代它。,8、回頭看一看OO的歷史,就會發(fā)現(xiàn)OO的出現(xiàn)是為了適應(yīng)軟件工程的發(fā)展。隨著項目規(guī)模的不斷擴(kuò)大,結(jié)構(gòu)化已經(jīng)力不從心了。引入OO的方法是為了將復(fù)雜的問題簡單化,可以理解成為另一種方式的自頂向下、逐步細(xì)化。分解到一定程度后就可以采用結(jié)構(gòu)化的方法去實(shí)現(xiàn)了。所以面向?qū)ο笈c結(jié)構(gòu)化不是格格不入的,而是相輔相成的。用牛頓力學(xué)和相對論比可能不太合適,是不是可以比喻成雙腳和車子:短距離步行還可以,距離遠(yuǎn)了走起來可是要累死了;但是要想回家還得下車來走兩步;所以走路永遠(yuǎn)不過時,開車就是比走路快!,哈哈,請同學(xué)考慮如何編程實(shí)現(xiàn)這個記事本程序?難度有多大?,面向?qū)ο蟪绦蛟O(shè)計是使用類和對象將現(xiàn)實(shí)世界中真實(shí)的或抽象的實(shí)體在程序中建立模型。,面向?qū)ο蟪绦蛟O(shè)計,面向?qū)ο蟪绦蛟O(shè)計的基本概念,什么是對象(Object)什么是消息(Message)什么是類(Class)什么是繼承(Inheritance)什么是接口(Interface),什么是對象(Object),對象的概念軟件對象是現(xiàn)實(shí)對象在程序中的模型現(xiàn)實(shí)世界對象的兩個特征:狀態(tài)(state)與行為(behavior).軟件對象也具有狀態(tài)與行為:狀態(tài):以一個或多個變量保存行為:用方法實(shí)現(xiàn)行為,對象的定義對象由變量與相關(guān)的方法結(jié)合起來構(gòu)成的。,對象(Object)一組數(shù)據(jù)及其對這些數(shù)據(jù)的操作過程對象中的數(shù)據(jù)稱為域(Field)例:plane1.weight對象中的操作過程稱為方法(Method)例:plane1.move(),換種說法來幫助理解,classCarintcolor_number;intdoor_number;intspeed;voidbrake()voidspeedUp();voidslowDown(),對象實(shí)例一個特定的對象稱為實(shí)例。,對象的使用-用句柄操縱對象每種編程語言都有自己的數(shù)據(jù)處理方式。有些時候,程序員必須時刻留意準(zhǔn)備處理的是什么類型。您曾利用一些特殊語法直接操作過對象,或處理過一些間接表示的對象嗎(C或C+里的指針)?所有這些在Java里都得到了簡化,任何東西都可看作對象。因此,我們可采用一種統(tǒng)一的語法,任何地方均可照搬不誤。但要注意,盡管將一切都“看作”對象,但操縱的標(biāo)識符實(shí)際是指向一個對象的“句柄”(Handle)。,可將這一情形想象成用遙控板(句柄)操縱電視機(jī)(對象)。只要握住這個遙控板,就相當(dāng)于掌握了與電視機(jī)連接的通道。但一旦需要“換頻道”或者“關(guān)小聲音”,我們實(shí)際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(jī)(對象)。如果要在房間里四處走走,并想保持對電視機(jī)的控制,那么手上拿著的是遙控板,而非電視機(jī)。,對象的封裝含義:對象的變量置于對象方法的包裹之中,被對外隱藏。優(yōu)點(diǎn):模塊化:不同對象代碼之間有一定獨(dú)立,對象可以在系統(tǒng)中方便移動。信息隱藏:保證修改對象信息時,不會對訪問它的對象產(chǎn)生影響。,什么是消息,對象之間通過發(fā)送消息進(jìn)行交互與通信。,消息由三部分構(gòu)成:接收消息的對象方法名稱方法的參數(shù),消息(Message)對象通過消息相互交流消息傳遞:發(fā)送消息的對象,接受消息的對象,傳遞的參數(shù),調(diào)用的方法消息傳遞(SendMessage)是方法調(diào)用(CallMethod):car1.accelerate(),換種說法,消息示例,消息機(jī)制的好處對象的行為是通過它的方法表達(dá)的,所以消息傳遞支持對象之間的所有交互。相互交換消息的對象可以在不同的進(jìn)程,甚至在不同的機(jī)器上。,什么是類(class),Aclassisablueprint,orprototype,thatdefinesthevariablesandthemethodscommontoallobjectsofacertainkind.一個類是一個藍(lán)圖或樣板,它定義了某一特定類的所有對象都具有的變量與方法。,類(Class)定義一類對象的模板,相當(dāng)于類型(Type),例:類Plane對象稱為類的實(shí)例(Instance),例:對象plane1是類Plane的一個實(shí)例,換種說法,類的結(jié)構(gòu),類示例-自行車,類的實(shí)例化示例,類中的變量與方法變量實(shí)例變量(instancevariable)包含特定對象的狀態(tài)類變量(classvariable)由類的所有實(shí)例共享方法實(shí)例方法(instancemethod)通過實(shí)例進(jìn)行訪問的方法。類方法(classmethod)通過類進(jìn)行調(diào)用的方法。,什么是繼承,繼承的子類和父類子類Aclassthatisderivedfromaparticularclass.從某個特定類派生出來的類。父類Aclassfromwhichaparticularclassisderived.派生出某個特定類的類。,繼承的含義子類繼承父類的狀態(tài)與方法。子類可以增加新的變量和方法。子類可以重寫(Override)繼承來的方法。注:繼承關(guān)系可以有多層,子類要繼承它所有父類的方法與狀態(tài)。,classCarintcolor_number;intdoor_number;intspeed;push_break()add_oil(),classTrash_CarextendsCardoubleamount;fill_trash(),繼承例,classCarintcolor_number;intdoor_number;intspeed;push_break()speed=0;add_oil(),classTrash_CarextendsCardoubleamount;fill_trash()push_break()speed=speed-10;,方法的覆蓋例,方法的重載(多態(tài)性)在同一個類中至少有兩個方法用同一個名字,但有不同的參數(shù)。,Java中的Object類(根類)Java中的Object類是最頂層的類,所有其他的類都是它直接或間接的子類。類型是Object的變量可以指向任意的對象。Object提供了運(yùn)行在JVM中的所有對象都需要的行為(方法)。,繼承的優(yōu)點(diǎn)通過繼承可以重用父類中的代碼。程序員可以定義含有一般行為的抽象類。抽象類中的很多方法是沒有實(shí)現(xiàn)的??梢栽诔橄箢惖幕A(chǔ)上定義特定的子類,實(shí)現(xiàn)具體的細(xì)節(jié)。,什么是接口,Java語言中,接口是彼此不相關(guān)對象之間發(fā)生聯(lián)系的手段。接口類似于一種對某種行為達(dá)成的協(xié)議。這種協(xié)議以包含在接口中的一組常量、一些方法定義的形式提出來。對象必須實(shí)現(xiàn)接口,才能具有某種行為。接口機(jī)制中沒有強(qiáng)制這些類之間建立超、子類關(guān)系。,香蕉牛肉餅干,共同特點(diǎn)是?,請各小組完成下面的作業(yè):給出幾何圖形的組合與繼承關(guān)系classpointintx;inty;show()system.out.println(“showapoint”);hide()system.out.println(“hideapoint”);簡單幾何圖形包括:點(diǎn)、線、三角形、正方形、長方形、五邊形、六邊形、多邊形、圓球體、圓拄、長方體、六棱體等,BruceEckel,ThinkinginJava3rd,ThinkinginJava一書封面的創(chuàng)作靈感來源于AmericanArts&CraftsMovement(美洲藝術(shù)手工藝品運(yùn)動)。這一運(yùn)動起始于世紀(jì)之交,1900到1920年達(dá)到了頂峰。它起源于英格蘭,具有一定的歷史背景。當(dāng)時正是機(jī)器革命產(chǎn)生的風(fēng)暴席卷整個大陸的時候,而且受到維多利亞地區(qū)強(qiáng)烈裝飾風(fēng)格的巨大影響。Arts&Crafts強(qiáng)調(diào)的是原始風(fēng)格,回歸自然的初衷是整個運(yùn)動的核心。那時對手工制作推崇備至,手工藝人特別得到尊重。正因為如此,人們遠(yuǎn)遠(yuǎn)避開現(xiàn)代工具的使用。這場運(yùn)動對整個藝術(shù)界造成了深遠(yuǎn)的影響,直至今天仍受到人們的懷念。特別是我們面臨又一次世紀(jì)之交,強(qiáng)烈的懷舊情緒難免涌上心來。計算機(jī)發(fā)展至今,已走過了很長的一段路。我們更迫切地感到:軟件設(shè)計中最重要的是設(shè)計者本身,而不是流水化的代碼編制。如設(shè)計者本身的素質(zhì)和修養(yǎng)不高,那么最多只是“生產(chǎn)”代碼的工具而已。,- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- java 語言程序設(shè)計 第二
鏈接地址:http://www.szxfmmzy.com/p-11496906.html