摘要:面向?qū)ο笏枷氲睦斫夂驼莆眨敲嫦驅(qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵,JAVA教學(xué)中學(xué)生往往由于不理解類的構(gòu)造機(jī)制編程中對(duì)封裝的公有,私有成員不能合理運(yùn)用,造成在繼承和訪問(wèn)上的錯(cuò)誤,極大地打擊了學(xué)生編程的積極性,該文介紹了JAVA面向?qū)ο笤O(shè)計(jì)的基本特點(diǎn),并對(duì)教學(xué)途徑和教學(xué)方法進(jìn)行了研究。
關(guān)鍵詞:JAVA;面向?qū)ο螅怀绦蛟O(shè)計(jì);教學(xué)
中圖分類號(hào):G642文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2011)04-0956-02
在軟件開(kāi)發(fā)的課程體系當(dāng)中,面向?qū)ο笫且婚T非常重要的專業(yè)課程,對(duì)這門課程的掌握和理解將對(duì)學(xué)生的編程能力和問(wèn)題分析能力有著深遠(yuǎn)的影響。面向?qū)ο蠼虒W(xué)目標(biāo)不僅要培養(yǎng)學(xué)生縝密的邏輯思維和數(shù)據(jù)抽象能力,而且要培養(yǎng)學(xué)生在軟件設(shè)計(jì)領(lǐng)域科學(xué)的思維方式, 能夠在實(shí)踐和工程實(shí)際中靈活地加以應(yīng)用。不斷改進(jìn)面向?qū)ο蟮慕虒W(xué)方法, 提高課程的教學(xué)質(zhì)量是培養(yǎng)高素質(zhì)軟件人才的迫切要求。
1 面向?qū)ο蠹夹g(shù)的概念
面向?qū)ο?Object Oriented,OO)是當(dāng)前計(jì)算機(jī)界關(guān)心的重點(diǎn),它是90年代軟件開(kāi)發(fā)方法的主流。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開(kāi)發(fā),擴(kuò)展到很寬的范圍。如數(shù)據(jù)庫(kù)系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺(tái)、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。
“面向?qū)ο蟆奔夹g(shù)是盡可能模擬人類的思維方式習(xí)慣,即問(wèn)題域與求解域在結(jié)構(gòu)上盡可能一致。與傳統(tǒng)方法相反,“ 面向?qū)ο蟆?方法以數(shù)據(jù)或信息為主線,把數(shù)據(jù)和處理結(jié)合構(gòu)成統(tǒng)一體— — 對(duì)象。順應(yīng)人類思維習(xí)慣,讓軟件開(kāi)發(fā)人員在解空間中直接模擬問(wèn)題空間中的對(duì)象及其行為。“ 面向?qū)ο蟆?技術(shù)能有效地改善軟件結(jié)構(gòu)(模塊化與封裝) ,提高軟件靈活性;支持軟件重用;支持增量式開(kāi)發(fā);支持大型復(fù)雜軟件系統(tǒng)開(kāi)發(fā)。
對(duì)象具有如下特點(diǎn): ①以數(shù)據(jù)為中心 ,不涉及與數(shù)據(jù)無(wú)關(guān)的操作; ②對(duì)象主動(dòng)處理而不是被動(dòng)地等待被處理,外部只能通過(guò)消息請(qǐng)求操作; ③具有黑盒性:外部操作時(shí) ,無(wú)須知道該對(duì)象內(nèi)部的數(shù)據(jù)結(jié)構(gòu)及算法;④具有并行性:不同對(duì)象各自獨(dú)立地處理自身數(shù)據(jù) ,彼此間僅通過(guò)傳遞消息完成通信; ⑤模塊獨(dú)立性好:內(nèi)聚強(qiáng)、耦合松。
2 面向?qū)ο蠼虒W(xué)方法分析
面向?qū)ο蟪绦蛟O(shè)計(jì)是高校計(jì)算機(jī)專業(yè)的一門主干課程,但是由于學(xué)生長(zhǎng)久以來(lái)對(duì)面向過(guò)程開(kāi)發(fā)思想的依賴,導(dǎo)致在理解面向?qū)ο蟾拍畹臅r(shí)候很難改變思維方式,不能很好的理解面向?qū)ο蟮乃枷耄绾卧O(shè)計(jì)科學(xué)的教學(xué)理念\"通過(guò)合適的教學(xué)方式傳達(dá)教育信息\"成為面向?qū)ο蟪绦蛟O(shè)計(jì)教師的當(dāng)務(wù)之急。筆者根據(jù)多年的教學(xué)經(jīng)驗(yàn),總結(jié)以舉例法使抽象的思想轉(zhuǎn)化為實(shí)際生活中的例子,減輕學(xué)生的理解負(fù)擔(dān),達(dá)到較好的教學(xué)目的。
2.1 面向?qū)ο缶幊趟枷氲睦斫?/p>
面向?qū)ο缶幊趟枷氲谋举|(zhì),就是使用軟件技術(shù)來(lái)模擬現(xiàn)實(shí)生活中的具體事件,理解面向?qū)ο缶幊趟枷氲年P(guān)鍵就是理解對(duì)象的定義以及類和對(duì)象之間的關(guān)系,在面向?qū)ο笳Z(yǔ)言JAVA的經(jīng)典教材《Think in JAVA》中有一句經(jīng)典的定義Everything Is an Object(Thinking in Java) ,圖1用來(lái)讓學(xué)生理解對(duì)象的由來(lái),即對(duì)象是從現(xiàn)實(shí)世界中的事物抽象而來(lái)。
由圖1可以得出,面向?qū)ο蟮乃枷刖褪前熏F(xiàn)實(shí)世界中的實(shí)體,通過(guò)映射的方式轉(zhuǎn)換到計(jì)算機(jī)世界中來(lái),并且用類來(lái)描述實(shí)體的行為和屬性。
2.2 類與對(duì)象之間的關(guān)系
類是一個(gè)抽象的概念,而對(duì)象是具體的,比如說(shuō)車是一個(gè)類的話,張三的那輛奔馳車就是車這個(gè)類的一個(gè)實(shí)例,動(dòng)物是一個(gè)類的話,李四的家養(yǎng)的那只貓就是動(dòng)物類的一個(gè)對(duì)象實(shí)例。人類就是一個(gè)類,這個(gè)類包含了所有人的共同屬性,像有四肢,有名字,會(huì)說(shuō)話等等。而實(shí)例就是這個(gè)人類的具體實(shí)現(xiàn),比如叫張三的這個(gè)人就是人類的一個(gè)實(shí)例,張三有著人類的所有屬性。張三是人類的一個(gè)實(shí)例,同樣李四也是人類的一個(gè)實(shí)例,但是張三和李四是不同的,因?yàn)樗麄兪侨祟惖膬蓚€(gè)不同的實(shí)例。一個(gè)對(duì)象是類的一個(gè)實(shí)例,它具有確定的屬性,如張三(人的實(shí)例)身高180,體重70公斤,大學(xué)本科,男,21歲,漢族。
人類只有一個(gè),人類的實(shí)例可以有包含無(wú)數(shù)個(gè)。此外,對(duì)象可以被創(chuàng)建和銷毀,但類是無(wú)所不在的,通以上的舉例可以讓學(xué)生理解,類是對(duì)一系列具有相似屬性和行為的事物的定義,類只存在于概念當(dāng)中,而對(duì)象則是根據(jù)類而定義出來(lái)的事物,對(duì)象與現(xiàn)實(shí)世界中的事物是一一對(duì)應(yīng)的。
2.3 類的封裝
對(duì)象的獨(dú)立性是通過(guò)封裝實(shí)現(xiàn)的,這是指將抽象得到的數(shù)據(jù)成員和代碼成員相結(jié)合,形成一個(gè)統(tǒng)一的有機(jī)整體,也就是說(shuō),將數(shù)據(jù)與操作數(shù)據(jù)的行為進(jìn)行有機(jī)的結(jié)合、統(tǒng)一。
通過(guò)封裝,一部分成員作為類與外部的接口,其他成員則被很好地隱蔽起來(lái),以實(shí)現(xiàn)對(duì)數(shù)據(jù)訪問(wèn)權(quán)限的合理控制,使程序中不同部分之間的相互影響減小到最低。這樣可以達(dá)到增強(qiáng)安全性和簡(jiǎn)化程序編寫(xiě)工作的目的。
以Java語(yǔ)言舉例,Java的訪問(wèn)控制關(guān)鍵字由三個(gè),分別是public、protected、private。
當(dāng)學(xué)生第一次了解對(duì)這三個(gè)名詞時(shí)往往不知它代表什么意思,可以通過(guò)舉例的方式讓學(xué)生理解,圖2用來(lái)理解訪問(wèn)控制關(guān)鍵之的使用。
如圖所示,公園代表的是public,公園是一個(gè)公共的場(chǎng)所,它沒(méi)有訪問(wèn)限制,任何人都可以自由的進(jìn)入,所以,它的訪問(wèn)級(jí)別是最低的,私人空間代表的是private,正如它的名字一樣,除了本人不允許其他人進(jìn)入,它的訪問(wèn)級(jí)別是最高的,而學(xué)校則是一個(gè)很特殊的地方,它對(duì)一部分人開(kāi)放,比如學(xué)生,但是不允許非學(xué)生以外的人進(jìn)入,換句話說(shuō)它是一個(gè)半公開(kāi)的場(chǎng)所,對(duì)它的訪問(wèn)是有限制的,它的訪問(wèn)級(jí)別介于public和private之間。
2.4 類的繼承
繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術(shù)使得復(fù)用以前的代碼非常容易,能夠大大縮短開(kāi)發(fā)周期,降低開(kāi)發(fā)費(fèi)用。比如可以先定義一個(gè)類叫車,車有以下屬性:車體大小,顏色,方向盤,論壇,而又由車這個(gè)類派生出轎車和卡車兩個(gè)類,為轎車添加一個(gè)小后備箱,而為卡車添加一個(gè)大貨箱。
繼承所表達(dá)的就是一種對(duì)象類之間的相交關(guān)系,它使得某類對(duì)象可以繼承另外一類對(duì)象的數(shù)據(jù)成員和成員方法。若類B繼承類A,則屬于B的對(duì)象便具有類A的全部或部分性質(zhì)(數(shù)據(jù)屬性)和功能(操作),我們稱被繼承的類A為基類、父類或超類,而稱繼承類B為A的派生類或子類。
在繼承中有兩個(gè)關(guān)鍵字會(huì)使學(xué)生經(jīng)常產(chǎn)生疑問(wèn),它們分別是this和super,同樣也可以通過(guò)舉例的方式來(lái)對(duì)學(xué)生解釋,假設(shè)有一座寺廟,廟里有一個(gè)和尚叫做 “悟能”,廟里的其他人都清楚他的姓名,大家過(guò)的相安無(wú)事,突然有一天,廟里來(lái)了一個(gè)游訪僧人,他的名字也叫做“悟能”,這樣的話打亂了原來(lái)的平靜,大家為了區(qū)分這兩個(gè)“悟能”,只好用“我們廟里的悟能”來(lái)稱呼原來(lái)寺廟里的“悟能”,在面向?qū)ο笾校覀兙涂梢允褂猛瑯拥脑韥?lái)區(qū)分類內(nèi)部的屬性和類外部傳遞的參數(shù),“我們廟里的”就可以用關(guān)鍵字this代替。
super關(guān)鍵字則可以通過(guò)兩方面來(lái)理解,super()的方式,代表子類調(diào)用父類的構(gòu)造函數(shù),來(lái)初始化由父類繼承下來(lái)的屬性,super.xxx的方式代表子類調(diào)用父類中的屬性或者方法來(lái)完善子類的操作,其中要注意的是如果父類的屬性和方法想被子類所調(diào)用,那么這些屬性和方法不能被定義為private。
2.5 多態(tài)的理解
多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問(wèn)題。
多態(tài)有兩種表現(xiàn)形式:重載和覆蓋,首先重載(overload),是發(fā)生在同一類中。與父類子類、繼承毫無(wú)關(guān)系。
標(biāo)識(shí)一個(gè)函數(shù)除了函數(shù)名外,還有函數(shù)的參數(shù)(個(gè)數(shù)和類型)。也就是說(shuō),一個(gè)類中可以有兩個(gè)或更多的函數(shù),叫同一個(gè)名字而他們的參數(shù)不同。
其次覆蓋(override),是發(fā)生在子類中,也就是說(shuō)必須有繼承的情況下才有覆蓋發(fā)生。
我們知道繼承一個(gè)類,也就有了父類了全部方法,如果你感到哪個(gè)方法功能要變,那就把那個(gè)函數(shù)在子類中重新實(shí)現(xiàn)一遍。
這樣再調(diào)用這個(gè)方法的時(shí)候,就是執(zhí)行子類中的過(guò)程了。父類中的函數(shù)就被覆蓋了。(當(dāng)然,覆蓋的時(shí)候函數(shù)名和參數(shù)要和父類中完全一樣,不然你的方法對(duì)父類中的方法就不起任何作用,因?yàn)閮烧呤莾蓚€(gè)函數(shù),毫不關(guān)系)。
3 總結(jié)
在JAVA面向?qū)ο蠼虒W(xué)過(guò)程中,需要讓學(xué)生明確學(xué)習(xí)的目的,學(xué)習(xí)java不是僅僅學(xué)習(xí)軟件開(kāi)發(fā)的方式,更重要的是要理解通過(guò)java語(yǔ)言而體現(xiàn)出來(lái)的面向?qū)ο蟮乃枷耄斫獾氖且环N全新的開(kāi)發(fā)模式。
例如,舉例求解矩形的面積和周長(zhǎng),在傳統(tǒng)的C語(yǔ)言中,我們要關(guān)心的是兩個(gè)函數(shù)以及調(diào)用函數(shù)時(shí)所需要的參數(shù),求解這個(gè)問(wèn)題使用到的函數(shù)是求周長(zhǎng)和求面積,參數(shù)是矩形的長(zhǎng)和寬,這樣的分析方式是面向過(guò)程的,我們的解決方案一般都是順序類型的,第一步需要做什么,第二步需要做什么等等。
如果使用JAVA這樣的面向?qū)ο笳Z(yǔ)言做開(kāi)發(fā),那么我們的關(guān)注點(diǎn)就發(fā)生了很大的變化,首先我們要關(guān)注的是在求矩形面積的過(guò)程中都出現(xiàn)了那些對(duì)象。求解矩形的面積,那么矩形就是我們要關(guān)心的對(duì)象,然后我們?nèi)ネ晟七@個(gè)對(duì)象把模擬到計(jì)算機(jī)世界中來(lái),就是把現(xiàn)實(shí)世界中的事物轉(zhuǎn)化成類,接著就要設(shè)計(jì)這個(gè)類,類的屬性就是矩形的長(zhǎng)和寬,類的方法是求周長(zhǎng)和求面積,這種方法看起來(lái)似乎和傳統(tǒng)的C語(yǔ)言方式內(nèi)容一致,但是本質(zhì)上卻有很大的區(qū)別,JAVA的類是把事物的屬性和方法當(dāng)做一個(gè)整體封裝起來(lái),這樣使得編程中各個(gè)組件之間的耦合度降低了,大大的節(jié)省了開(kāi)發(fā)的成本。
面向?qū)ο缶幊套⒅氐氖抢斫猓挥修D(zhuǎn)變傳統(tǒng)的思維方式,才能熟練的掌握面向?qū)ο箝_(kāi)發(fā)的核心內(nèi)容,這里也對(duì)教師提出了更高的要求,在教授了知識(shí)的基礎(chǔ)上,要引導(dǎo)學(xué)生逐步的理解和熟練面向?qū)ο箝_(kāi)發(fā)方式,多舉例子,用一些生活中學(xué)生熟悉的例子和面向?qū)ο箝_(kāi)發(fā)的過(guò)程結(jié)合起來(lái),達(dá)到較好的教學(xué)效果。
參考文獻(xiàn):
[1] Bruegge B,Dutoit A H.面向?qū)ο蟮牡能浖こ蘙M].北京:清華大學(xué)出版社,2002.
[2] 吳建設(shè),丁繼安,石偉平.基于建構(gòu)主義理論的高職實(shí)踐教學(xué)體系的整體構(gòu)建[J].中國(guó)高教研究,2004(11).
[3] 嚴(yán)仲興.Java 面向?qū)ο蟪绦蛟O(shè)計(jì)[M].北京:高等教育出版社,2005.
[4] 汪成為,鄭小軍,彭木昌.面向?qū)ο蠓治觥⒃O(shè)計(jì)及應(yīng)用[M].北京:國(guó)防工業(yè)出版社,1992.
[5] 張紅英.淺析面向?qū)ο蟪绦蛟O(shè)計(jì)[J].河北能源職業(yè)技術(shù)學(xué)院,2003(3).