




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第1章 Java與面向?qū)ο笏枷氲?章 Java與面向?qū)ο笏枷牍び破涫拢叵让髌淅怼⒗淦鳌榱嗽趯W(xué)習(xí)Java的征途中少走彎路、多走捷徑,我們有必要了解Java語言中蘊(yùn)涵的面向?qū)ο蟮戎笇?dǎo)思想,并在設(shè)計(jì)和開發(fā)Java程序的過程中充分應(yīng)用這些 思想。1.1 初識Java語言德國大哲學(xué)家黑格爾說過:凡是存在的,都是合理的。用這句話的推論可以很好地形容Java語言的前景:凡是流行的,總有它流行的道理。雖然說,Java語言的誕生是個(gè)偶然的過程,但它卻能很好地融合“面向?qū)ο蟆薄ⅰ翱缙脚_”和“編程簡潔”等特性,所以它的流行是個(gè)必然的趨勢。并且,隨著Java語言的不斷發(fā)展,它的應(yīng)用前景將更為寬闊。說到這里,可
2、能有的讀者會被“面向?qū)ο笏枷搿薄ⅰ翱缙脚_”等名詞搞得找不到方向,其實(shí),這些不是高深晦澀的八股文,而是同我們現(xiàn)實(shí)生活密切相關(guān)的概念。1.1.1 Java是什么Java語言的誕生可以說是個(gè)“無意栽柳綠成蔭”的過程。在20世紀(jì)90年代,Sun公司的工程師們經(jīng)常要商討如何解決面包烘烤機(jī)、恒溫器等日常數(shù)控系統(tǒng)中的數(shù)據(jù)共享問題,比方說,如何在面包烘烤機(jī)的硬件系統(tǒng)內(nèi)核里讀取恒溫器里關(guān)于溫度的數(shù)據(jù),實(shí)現(xiàn)定時(shí)加熱的功能。這些工程師在研究中發(fā)現(xiàn),由于不同產(chǎn)品的制造商們采用不同的硬件和應(yīng)用軟件來組裝他們的產(chǎn)品,所以要讓這些產(chǎn)品在協(xié)同工作時(shí)實(shí)現(xiàn)數(shù)據(jù)共享是比較困難的,這些困難主要有:如何保證共享數(shù)據(jù)時(shí)的數(shù)據(jù)安全性,如何
3、定義數(shù)據(jù)共享和傳輸?shù)母袷降取R虼耍@些工程師把各種不同的產(chǎn)品按功能模塊拆分,理解其基本功能模塊(比如加熱模塊)的特性,以便使它們能更好地一起工作。事實(shí)上,他們的這種工作方法,除了能有效解決最初的“共享數(shù)據(jù)”的問題外,同時(shí)也可以解決因硬件標(biāo)準(zhǔn)不同而導(dǎo)致的其他方面的問題,比如可以讓烤面包機(jī)和恒溫器結(jié)合,讓烤面包機(jī)在達(dá)到一定的時(shí)間停止烘烤,進(jìn)行保溫工作。隨著研究的深入,他們發(fā)現(xiàn),通過這種工作方法,還能通過集成功能模塊,快速有效地組裝各種產(chǎn)品和模塊。不過,這種集成,需要在各種不同標(biāo)準(zhǔn)的模塊上構(gòu)建一層統(tǒng)一的能屏蔽不同硬件模塊差異的操作系統(tǒng)(這就是Java虛擬機(jī)的雛形),由于當(dāng)時(shí)尚無一種語言可以實(shí)現(xiàn)上述的
4、工作思路,所以工程師們就打算自己開發(fā)一種新的編程語言,于是Java語言應(yīng)運(yùn)而生。Java語言之所以流行,是因?yàn)樗哂锌缙脚_性,即使用Java語言,程序員可以開發(fā)能在不同網(wǎng)絡(luò)平臺和不同操作系統(tǒng)上運(yùn)行的應(yīng)用軟件。這樣的好處在于,使用Java的軟件開發(fā)公司就不必再考慮項(xiàng)目在不同操作系統(tǒng)中的開發(fā)和安裝細(xì)節(jié),從而可以把更多的精力和資源安排在開發(fā)項(xiàng)目功能和設(shè)計(jì)項(xiàng)目的架構(gòu)上。綜上所述,Java除了具有其他編程語言所有的好處之外,還具有以下四個(gè)特點(diǎn):1. 由于Java的語法結(jié)構(gòu)比較簡潔,所以學(xué)習(xí)起來很容易。2. 由于Java語言功能強(qiáng)大,所以使用Java語言可以開發(fā)多種類型的應(yīng)用。比如使用J2ME可以開發(fā)基于
5、手機(jī)的應(yīng)用,使用J2EE可以開發(fā)基于企業(yè)級的大型應(yīng)用。3. 由于Java語言是基于面向?qū)ο蟮乃枷氲模杂肑ava語言開發(fā)出來的代碼可以具有結(jié)構(gòu)清晰、維護(hù)容易和擴(kuò)展簡便等優(yōu)點(diǎn)。4. 由于Java語言的運(yùn)行環(huán)境具有很強(qiáng)的容錯(cuò)機(jī)制,能保證Java程序在諸如內(nèi)存不夠的情況下不崩潰,不死機(jī),所以使用Java語言可以開發(fā)出健壯性的代碼。1.1.2 為什么要選用Java語言由于Java具有跨平臺的特性,所以同其他編程語言相比,它更具有以下的優(yōu)勢:1. 用Java可以優(yōu)化同數(shù)據(jù)庫的連接連接訪問數(shù)據(jù)庫是項(xiàng)目開發(fā)的基本需求,能實(shí)現(xiàn)數(shù)據(jù)庫訪問控制的編程語言很多,但Java語言更能根據(jù)項(xiàng)目的實(shí)際需求,采用適合的方式
6、,用一種高效和安全的方式同數(shù)據(jù)庫交互。Java采用JDBC(Java DataBase Connectivity) 提供的方法連接到數(shù)據(jù)庫上。JDBC里封裝了用Java語言讀寫數(shù)據(jù)庫的通用方法,同常見的ODBC連接數(shù)據(jù)庫的方式相比,JDBC由于具有了Java語言跨平臺的特性,不僅能同Windows平臺上的數(shù)據(jù)庫進(jìn)行交互,更能方便地連接訪問構(gòu)架在其他操作系統(tǒng)上的數(shù)據(jù)庫環(huán)境。此外,通過JDBC里定義的優(yōu)化查詢功能,程序員更能以高效和安全的方式執(zhí)行SQL語句,操作數(shù)據(jù)庫。2. 用Java可以開發(fā)具有強(qiáng)大功能的網(wǎng)絡(luò)應(yīng)用現(xiàn)在網(wǎng)絡(luò)的應(yīng)用涉及到各個(gè)方面中,比如我們可以在家中邊喝著咖啡,邊在網(wǎng)絡(luò)上訂
7、購圖書,安逸的在家等著圖書送上門。又或者某個(gè)公司的老板,在家中通過Java所開發(fā)的應(yīng)用程序,就可以管理公司的日常運(yùn)營。使用Java語言,可以在不同的網(wǎng)絡(luò)環(huán)境上構(gòu)架一個(gè)虛擬的軟件平臺,這層平臺不僅能向用戶屏蔽不同網(wǎng)絡(luò)間的差異,更能封裝網(wǎng)絡(luò)底層的數(shù)據(jù)交換與通訊的細(xì)節(jié)。所以,網(wǎng)絡(luò)編程是Java語言的特長。程序員們通過Java提供的網(wǎng)絡(luò)開發(fā)類庫,不僅能快速地開發(fā)基本的Web應(yīng)用項(xiàng)目,更能開發(fā)面向網(wǎng)絡(luò)服務(wù)的高級應(yīng)用,比如能實(shí)現(xiàn)“運(yùn)行異地代碼,就像在本地運(yùn)行一樣的”RMI分布式應(yīng)用。3. 用Java語言可以連接不同硬件平臺如果我們要實(shí)現(xiàn)手機(jī)與計(jì)算機(jī)之間的通訊和交互,這用其他編程語言的眼光來看是不可能完成的
8、任務(wù),因?yàn)椴煌布脚_包含了不同的操作系統(tǒng),而不同操作系統(tǒng)間的數(shù)據(jù)傳輸和存儲格式的標(biāo)準(zhǔn)是不同的。但使用Java語言可以輕易地實(shí)現(xiàn)這一需求。Java語言的跨平臺特性導(dǎo)致了Java開發(fā)出來的代碼是面向Java虛擬機(jī)的,而不是面向操作系統(tǒng),更不是面向硬件的。所以,Java語言包含了諸如J2ME、J2EE和J2SE等開發(fā)標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)包含的類庫(即包含實(shí)現(xiàn)特定功能的jar包,類似于C語言的.h文件)能幫助程序員實(shí)現(xiàn)不同硬件平臺的連接。綜上所述,同其他編程語言相比,Java具有跨平臺(及其衍生)的優(yōu)勢,這些優(yōu)勢不僅能從語法架構(gòu)的層次,幫助程序員改善項(xiàng)目開發(fā)的方式,提高項(xiàng)目開發(fā)的效率,更能從應(yīng)用架構(gòu)的層次
9、,幫助程序員很好地實(shí)現(xiàn)“一次開發(fā),多次運(yùn)行”的項(xiàng)目部署方式。這對縮短項(xiàng)目開發(fā)周期,降低項(xiàng)目的開發(fā)和維護(hù)成本是大有好處的。4. 支持Java語言的指導(dǎo)思想和標(biāo)準(zhǔn)很多 除了有面向?qū)ο笏枷雭碇笇?dǎo)Java的開發(fā)設(shè)計(jì)外,能優(yōu)化代碼結(jié)構(gòu)的設(shè)計(jì)模式原則也可以用來指導(dǎo)Java編程。此外,在手機(jī)開發(fā)和企業(yè)級開發(fā)領(lǐng)域也有較多的標(biāo)準(zhǔn)來規(guī)范和協(xié)助Java編程。在Web和數(shù)據(jù)庫領(lǐng)域中,有多家商業(yè)和非商業(yè)的團(tuán)隊(duì),都對Java有很好的支持和擴(kuò)展。有了這些方法論和標(biāo)準(zhǔn)的幫助,程序員們在開發(fā)Java項(xiàng)目時(shí),可以較容易地得到技術(shù)和設(shè)計(jì)方面的支持。1.1.3 Java語言的解釋執(zhí)行與跨平臺特性一些編程語言(如C+)的編譯器是根據(jù)源
10、文件,直接輸出可執(zhí)行的EXE文件。與之相比,Java 編譯器的輸出并不是可執(zhí)行的代碼,而是字節(jié)碼(byte code)。所謂字節(jié)碼,是一套能在Java 虛擬機(jī)下執(zhí)行的高度優(yōu)化的指令集,在內(nèi)存中也只不過是1010這樣的字節(jié)編碼。Java 虛擬機(jī)(Java Virtual Machine,JVM),從其表現(xiàn)形式來看,是一個(gè)字節(jié)碼解釋器,即可以解釋執(zhí)行字節(jié)碼定義的動作。從操作系統(tǒng)的級別層次來看,它是構(gòu)架在不同操作系統(tǒng)上的,能屏蔽不同操作系統(tǒng)差異的基于軟件的平臺。虛擬機(jī)能保證用戶看到其注重的代碼的運(yùn)行結(jié)果,而向用戶屏蔽其不關(guān)心的代碼在不同操作系統(tǒng)里的執(zhí)行細(xì)節(jié)。這就好比我們在安裝完聲卡的驅(qū)動程序后,Wi
11、ndows操作系統(tǒng)只向我們展示聲卡的發(fā)聲效果,而不是聲卡的工作方式。將Java 程序解釋成字節(jié)碼,而不是最終的面向具體操作系統(tǒng)的可執(zhí)行文件,可以讓它運(yùn)行在不同平臺的虛擬機(jī)上,事實(shí)上,我們只要在各種操作系統(tǒng)上都安裝不同的Java 虛擬機(jī)就可以做到這點(diǎn)。所以,在特定的操作系統(tǒng)中,只要有支持Java功能的jar包存在,Java 程序就可以運(yùn)行了。盡管不同平臺的Java 虛擬機(jī)和對應(yīng)的支持jar包都是不同的(它們不應(yīng)該相同),但它們的作用都是解釋并運(yùn)行Java 字節(jié)碼。因此,字節(jié)碼的解釋與運(yùn)行機(jī)制是保證程序能很容易地在不同操作系統(tǒng)上運(yùn)行。圖1-1說明了虛擬機(jī)的工作方式:圖1.1 Java虛擬機(jī)的工作方
12、式從Java解釋執(zhí)行的運(yùn)行機(jī)制的角度上,我們能看到其跨平臺的特性,和保證其擁有跨平臺的支持機(jī)制。1.1.4 怎樣學(xué)好JavaJava語言的前景非常廣闊,但是同時(shí)也請大家放心,Java的應(yīng)用面很廣,但并不意味著它很難學(xué)。事實(shí)上正好相反,由于Java語言把一些復(fù)雜而煩瑣的實(shí)現(xiàn)細(xì)節(jié)封裝到了定義好的功能包中,所以程序員們能以調(diào)用接口方法的方式,實(shí)現(xiàn)看上去很復(fù)雜的應(yīng)用。另外,學(xué)習(xí)Java是零基礎(chǔ)的,大家只需要有軟件操作的經(jīng)驗(yàn),就可以由淺入深地學(xué)習(xí)Java語法和Java的技術(shù)組件。雖然說Java的學(xué)習(xí)不需要有軟件編程的基礎(chǔ),但是,如果大家掌握了以下的學(xué)習(xí)Java的方法,就可以事半功倍地學(xué)好Java語言。l
13、 重點(diǎn)關(guān)注代碼的結(jié)構(gòu),不要拘泥于語法實(shí)現(xiàn)的細(xì)節(jié)學(xué)習(xí)語法能幫助我們更好地了解Java的特性,但學(xué)習(xí)語法的最終目的是構(gòu)造功能模塊和開發(fā)項(xiàng)目,所以,在學(xué)習(xí)過程中,我們更應(yīng)從面向?qū)ο笏枷氲慕嵌葋碛^察語法的實(shí)現(xiàn)方式,而不要拘泥于 “某函數(shù)的參數(shù)是什么含義”等細(xì)節(jié)問題。l 用面向?qū)ο蟮乃枷雭碇笇?dǎo)學(xué)習(xí)過程面向?qū)ο笏枷雲(yún)⒄樟爽F(xiàn)實(shí)生活中觀察問題、解決問題的思維方式,將應(yīng)用程序中的一切模型整合成對象,并通過歸納和抽象對象,提取出一套解決問題的方法和思路。程序員們能使用面向?qū)ο笏枷霕?gòu)建出一系列符合規(guī)范的組件對象。通過組裝這些對象,程序員們能比較輕松地開發(fā)和擴(kuò)展項(xiàng)目。所以,通過面向?qū)ο笏枷氲闹笇?dǎo),我們能很好地學(xué)會用J
14、ava語言構(gòu)建模塊和項(xiàng)目的一般方式。只有有了良好的代碼結(jié)構(gòu),項(xiàng)目才能很好地發(fā)揮由Java語言帶來的優(yōu)勢。l 理論與實(shí)踐相結(jié)合我們通過學(xué)習(xí)理論,能夠很好地了解Java語言的優(yōu)點(diǎn)和項(xiàng)目開發(fā)的方式,但我們更需要通過上機(jī)實(shí)踐來加深對Java語言的理解。事實(shí)上,我們在動手實(shí)踐中,不僅能很好地檢驗(yàn)我們的理論學(xué)習(xí)成果,更能幫助我們找出自己學(xué)習(xí)上的薄弱點(diǎn)。另外,動手實(shí)踐過程中的糾錯(cuò)過程更能幫助我們在短時(shí)間內(nèi)掌握J(rèn)ava語言。l 多查閱資料,多尋求幫助在學(xué)習(xí)和開發(fā)過程中,如果我們遇到了語法或設(shè)計(jì)方面的問題,而自己又無法解決,那我們就可以從書本和網(wǎng)絡(luò)上查閱資料,幫助我們解決問題,事實(shí)上,網(wǎng)絡(luò)上的資料多而雜,如何從
15、海量的信息中找到自己需要的,這是個(gè)問題。比如,我們想要知道,如何用Java語言開發(fā)圖形界面,我們可以在的搜索欄里輸入“Java;圖形界面開發(fā)”,經(jīng)過搜索,我們可以在網(wǎng)頁資料里得到“Swing”和“Awt”等關(guān)鍵字,通過對這些關(guān)鍵字的遞進(jìn)式搜索,就可以得到需要的內(nèi)容,有時(shí),甚至源代碼都能得到。1.2 什么是面向?qū)ο笏枷肽壳埃嫦驅(qū)ο蟮乃枷氡卉浖_發(fā)界廣為追捧,其實(shí),面向?qū)ο笏枷氩皇歉呱畹睦碚摚歉鶕?jù)前人大量編程項(xiàng)目總結(jié)出來的一套分析和解決編程方面問題的方法。以面向?qū)ο笏枷霝橹笇?dǎo),可以優(yōu)化Java代碼的結(jié)構(gòu),更可以讓數(shù)據(jù)庫訪問模塊變得富有彈 性即讓代碼和模塊能更好地適應(yīng)項(xiàng)目需求的頻繁變化。1.2
16、.1 軟件開發(fā)的方法學(xué)面向?qū)ο笏枷胩岢龅谋尘坝?jì)算機(jī)語言剛出現(xiàn)時(shí),采用的編程語言是面向硬件的機(jī)器語言,即用一大堆計(jì)算機(jī)硬件能識別的0和1來編寫代碼。寫這種機(jī)器代碼需要很高的技巧,它們調(diào)試起來也比較困難,所以當(dāng)時(shí)的程序員都是精英級別的人物。為了提高編程語言的適用性,提升代碼編寫的效率,專家們開發(fā)了以匯編語言為代表的低級語言,即用一些助記符來代替晦澀的機(jī)器語言,例如用add a b,來計(jì)算a+b的值。這類語言直接與內(nèi)存和其他硬件打交道,以使用最小系統(tǒng)資源和謀求最大硬件利用率為開發(fā)準(zhǔn)則,在當(dāng)時(shí)低配置的硬件環(huán)境下是有很大的實(shí)用意義的。但是,用這種編程語言開發(fā)出來的代碼的結(jié)構(gòu)非常混亂,并且很難讀懂。這樣的
17、情況可能在幾百行規(guī)模的代碼量下并不明顯,但如果當(dāng)項(xiàng)目規(guī)模擴(kuò)大,代碼量越來越多的時(shí)候,這個(gè)問題就突顯出來了。更有甚者,作者自己在開發(fā)結(jié)束后,往往會忘記自己寫的代碼的結(jié)構(gòu)和語意,這樣的代碼很難維護(hù)和閱讀。為了解決這類問題,提高代碼的邏輯性,軟件語言方面的專家提出了初步融合面向?qū)ο笏枷氲慕Y(jié)構(gòu)化的面向過程語言。結(jié)構(gòu)化語言的重要特征是,在代碼里分離了代碼邏輯和程序數(shù)據(jù),并使用了分支(IF)和循環(huán)(While和For)等關(guān)鍵字來優(yōu)化代碼的邏輯結(jié)構(gòu)。由于結(jié)構(gòu)化的語言使用子模塊順序調(diào)用的方式控制代碼流程,所以又叫面向過程語言,以C語言為代表。和匯編語言相比,面向過程語言能很大程度地改善代碼結(jié)構(gòu),提高代碼的邏輯
18、性。具體表現(xiàn)為以下兩點(diǎn):1. 由于在面向過程的語言里,可以把功能點(diǎn)以函數(shù)(過程)的形式封裝,所以代碼的重用性能會得到一定程度的提高,即后繼項(xiàng)目可以通過調(diào)用具有相同功能的函數(shù)來利用現(xiàn)有的代碼,這對項(xiàng)目的二次開發(fā)或者是功能升級是非常有利的。2. 由于面向過程語言摒棄了使用goto(或者是jump)語句的跳轉(zhuǎn)方式,而使用了分支和循環(huán)等結(jié)構(gòu)性語句,所以代碼的結(jié)構(gòu)能得到大幅度的改善,從而能在一定程度上提高項(xiàng)目的可讀性和可維護(hù)性。然而,在面向過程語言的使用過程中,程序員們發(fā)現(xiàn)其依然有本質(zhì)上的缺陷,具體表現(xiàn)為:1. 在模塊間的函數(shù)調(diào)用時(shí),由于無法屏蔽模塊里不希望被訪問修改的關(guān)鍵變量,這將導(dǎo)致模塊間有很高的關(guān)
19、聯(lián)度,這對代碼維護(hù)是非常不利的,往往會修改一處而觸動全部代碼。2. 代碼的重用級別僅僅是局限于函數(shù)級別的,這導(dǎo)致無法大量有效地利用已開發(fā)完成的代碼成果,這對代碼的重復(fù)性利用非常不利。3. 函數(shù)的定義是針對具體動作和具體對象的。比如說,我們要定義打印的方法,如果我們使用的打印機(jī)型號不同,那我們不得不根據(jù)不同的型號,定義多個(gè)不同名的方法。也就是說,面對業(yè)務(wù)邏輯(業(yè)務(wù)上要做的事情)相同但業(yè)務(wù)邏輯處理對象不同的需求,必須要寫成多個(gè)不同名的函數(shù),這導(dǎo)致了代碼過于注重細(xì)節(jié),而無法考慮邏輯性、重用性和維護(hù)性等大局方面的問題。為了解決上述問題,軟件語言的專家們吸取面向過程語言中“結(jié)構(gòu)化”和“模塊化”等優(yōu)秀方法
20、,提出了面向?qū)ο蟮闹笇?dǎo)思想。面向?qū)ο笏枷雲(yún)⒄樟爽F(xiàn)實(shí)生活中觀察問題、解決問題的思維方式,將應(yīng)用程序中的一切模型以類的形式,整合成對象,并通過歸納和抽象對象,提取出一套解決問題的方法和思路。所以,面向?qū)ο笏枷肟梢酝ㄟ^優(yōu)化模塊間的結(jié)構(gòu)和加固模塊間的堅(jiān)固性,來指導(dǎo)構(gòu)造軟件項(xiàng)目行業(yè)“摩天大樓”。1.2.2 面向?qū)ο蟮奈镔|(zhì)基礎(chǔ)類與封裝類是基于面向?qū)ο笏枷刖幊陶Z言的基礎(chǔ),程序員可以把具有相同業(yè)務(wù)性質(zhì)的代碼封裝到一個(gè)類里,通過接口方法向外部代碼提供服務(wù),同時(shí)向外部代碼屏蔽類里服務(wù)的具體實(shí)現(xiàn)方式。對象是類的實(shí)例,類一般是個(gè)抽象名詞,比如“人類”,而對象則是具體的物質(zhì)存在,比如“張三”這個(gè)人。在現(xiàn)實(shí)生活中,我們經(jīng)
21、常會遇到“類”和“對象”這些概念,比如封裝了能實(shí)現(xiàn)“用微波加熱材料”功能的微波爐類。這里,用戶可以使用面板上的按鈕,使用該類里提供的加熱等服務(wù),并且,由于該類實(shí)現(xiàn)了封裝,所以在使用的時(shí)候,用戶可以不用了解其中的微波加熱原理以及實(shí)現(xiàn)機(jī)制。通過上面例子我們可以看出,類是對現(xiàn)實(shí)生活中真正存在的對象的描述,并且這些對象都具有共同的屬性和行為。但是,根據(jù)不同的系統(tǒng)需求,同樣的一種對象會被描述成具有不同屬性和行為的類。比如,對于銀行系統(tǒng),人的這個(gè)類應(yīng)該具有賬號、存款余額的屬性和存錢、取錢的行為,每個(gè)人都有自己不同的賬號和相關(guān)金額,但是他們存錢取錢的流程是相通的;而對于電信系統(tǒng),同樣的人這個(gè)類應(yīng)該具有手機(jī)號
22、碼、卡內(nèi)余額的屬性和充費(fèi)、扣費(fèi)的行為。因此,我們要注意類的定義和它所封裝的行為是否能夠正確的反映實(shí)際系統(tǒng)的需求。1.2.3 抽象與代碼復(fù)用抽象類與概念抽象抽象類也是類的一種,它同樣擁有屬性和行為,但是它與普通類最大的區(qū)別就在于抽象類里面允許有一些抽象的行為,抽象類只從概念的角度出發(fā)定義了類的行為,但是它沒有描述行為的實(shí)現(xiàn)細(xì)節(jié),而是把這個(gè)任務(wù)交給了它的子類來實(shí)現(xiàn),它本身充當(dāng)了父類的角色。因此,我們可以說子類不僅有從父類繼承過來的屬性和行為,而且它可以在父類原有內(nèi)容的基礎(chǔ)上做一些補(bǔ)充和發(fā)揮。父類只是做了一個(gè)概念的抽象。下圖1-2說明了這種抽象的必要性:圖1-2 抽象類示意圖對于汽車、自行車這兩個(gè)類
23、來說,它們都是父類車的子類,具有位置、速度屬性和前進(jìn)、后退行為,但是汽車有四個(gè)輪子,自行車有兩個(gè)輪子,汽車的運(yùn)動是靠發(fā)動機(jī)來實(shí)現(xiàn)的,而自行車的運(yùn)動是靠人力來實(shí)現(xiàn)的。因此,我們在車這個(gè)父類里面只定義了關(guān)于運(yùn)動的兩個(gè)方法,具體的實(shí)現(xiàn)細(xì)節(jié)交給了它的兩個(gè)子類來完成。這樣我們不僅避免了在兩個(gè)相近的類之間定義重復(fù)的屬性和行為,而且還解決了允許不同的類具體的實(shí)現(xiàn)細(xì)節(jié)有所變化的問題。抽象類可以幫助我們更加有效地解決代碼重復(fù)問題,并且,它又不失靈活性,又同時(shí)達(dá)到了概念抽象的目的。這里我們又通過抽象類的概念引出了類之間,一個(gè)重要關(guān)系,就是子類與父類的繼承,當(dāng)然不僅抽象類可以作為父類,其他的一般類同樣可以充當(dāng)為某一
24、子類的父類。只要它有這種繼承的需求我們就可以這樣來定義。1.2.4 模塊的開關(guān)接口與功能抽象接口的功能與抽象類相似,但是接口只能定義行為,這些行為的具體細(xì)節(jié)在實(shí)現(xiàn)了接口的類中描述,而抽象類還可以為這些類定義一些相同的屬性,因此我們可以說,接口比抽象類要更加抽象。接口中只定義公共的行為,這些行為也就是實(shí)現(xiàn)它的那些類的功能,不同的類可以有不同實(shí)現(xiàn)細(xì)節(jié),這里的原理與抽象類相同。下圖1-3說明了接口是如何做到功能抽象的:圖1-3 接口示意圖我們定義了交通工具這個(gè)接口,在這個(gè)接口里面定義了移動這個(gè)行為,但是行為的具體實(shí)現(xiàn)細(xì)節(jié)是在火車和飛機(jī)兩個(gè)類里面完成的,并且是由不同的方式來實(shí)現(xiàn)的。假設(shè)某個(gè)用戶有了一個(gè)
25、從上海到北京的行程安排,并且由于時(shí)間緊,不能確定選擇哪一種具體的交通工具,只知道要發(fā)生移動這個(gè)行為。那么,他可以先選擇交通工具這個(gè)接口的移動行為,具體是坐火車還是坐飛機(jī)我們可以根據(jù)實(shí)際的情況來定。接口是單單從行為的角度出發(fā),把功能做了概念上的抽象,使得不同的類通過不同的機(jī)制實(shí)現(xiàn)名稱相同的行為,方便使用者調(diào)用,隱藏了具體的實(shí)現(xiàn)細(xì)節(jié)。1.2.5 同名但不同參多態(tài)與重載多態(tài)是面向?qū)ο缶幊痰囊粋€(gè)重要特征,從字面意思來看就是指具有多種形式或形態(tài)的情形。在面向?qū)ο蟮木幊讨校鄳B(tài)主要是指針對于類的行為有多種不同的變化,用相同的語言結(jié)構(gòu),來表示不同類型的實(shí)體或?qū)Σ煌愋偷膶?shí)體進(jìn)行操作。即“相同的界面,不同的內(nèi)
26、部實(shí)現(xiàn)形式”。通常通過重載和覆寫來實(shí)現(xiàn)多態(tài)。重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。就是在類中可以創(chuàng)建多種行為,這些行為有一個(gè)特征是它們具有相同的名字,但具有不同的參數(shù)和不同的表現(xiàn)形式。調(diào)用行為時(shí)通過傳遞給它們的不同個(gè)數(shù)和類型的參數(shù)來決定具體使用哪個(gè)方法,這就是多態(tài)性的一種表現(xiàn),雖然行為的名字相同,但得到的是不同的表現(xiàn)形式。重載在我們的現(xiàn)實(shí)生活中也很常見。如:保姆類有洗的這個(gè)行為,但是我們可以給她衣服或餐具等不同的對象,她會根據(jù)不同的輸入實(shí)現(xiàn)不同的洗的細(xì)節(jié),如果是衣服的話就放在盆里洗,如果是洗碗就在水池里洗。這帶來最大的好處就是對于命令的發(fā)起者主人來說不需要記住太多的洗衣服還是洗碗的
27、方法,只要把這些臟東西交給保姆并且發(fā)出一個(gè)洗的指令,保姆就會自動地進(jìn)行處理,屏蔽了細(xì)節(jié)實(shí)現(xiàn),不僅方便了主人,同時(shí)也提高了自己的價(jià)值。讓我們談?wù)劻硗庖环N多態(tài)的實(shí)現(xiàn)覆寫。還記得我們上面提到過的子類和父類嗎?是的,子類不僅可以實(shí)現(xiàn)父類里面的只給出具體定義而沒有實(shí)現(xiàn)細(xì)節(jié)的行為,子類同時(shí)也可以改變父類中的行為,這個(gè)我們可以稱之為“有所繼承,有所發(fā)揮”。當(dāng)你發(fā)現(xiàn)老爸那一套做法已經(jīng)落伍了的時(shí)候,你是否會去改變它呢。我們把這種在子類中改變父類行為的具體實(shí)現(xiàn)細(xì)節(jié),但是名字和接受的輸入對象不變的動作就稱之為覆寫。覆寫在我們的現(xiàn)實(shí)生活中同樣有著重要的意義。還拿上面的那個(gè)例子來說,原先的那個(gè)保姆帶了一個(gè)徒弟,因?yàn)橥降?/p>
28、從師傅那里學(xué)會了如何做個(gè)好保姆,特別是如何洗東西,做保姆對于她來說可能更有優(yōu)勢。但是時(shí)代進(jìn)步了,我們的主人家里添置了洗衣機(jī)、洗碗機(jī)等家用電器。徒弟發(fā)現(xiàn)用這些東西會更加方便,既省時(shí)又省力,于是她快速地學(xué)會了如何操作這些家用電器來為主人提供更加優(yōu)質(zhì)的服務(wù)。對于她來說同樣可以洗衣服和洗碗,只不過用的是洗衣機(jī)和洗碗機(jī),而不是像她的師傅放在盆里或水池里洗了,并且現(xiàn)在洗得更快更好了。對于任何一個(gè)保姆來說,主人只要給她臟東西并且發(fā)出洗的命令,她就會根據(jù)實(shí)際情況進(jìn)行相應(yīng)的操作,這時(shí)在這個(gè)洗的行為上發(fā)生了重載。主人把同樣的碗這個(gè)對象交給保姆師傅和保姆徒弟來洗,她們也會進(jìn)行相應(yīng)的操作,師傅放在水池里洗,而徒弟用洗
29、碗機(jī)洗,此時(shí)在這個(gè)洗的行為上卻發(fā)生了覆寫。總結(jié)一下,類的行為可以有多種不同的表現(xiàn)形式,這叫做多態(tài)。對于那些具有相同的名字但是不同操作對象的行為來說,我們稱之為重載;對于那些不僅擁有相同的名字而且操作的對象也相同,但是在子類與父類里面具有不同實(shí)現(xiàn)細(xì)節(jié)的行為來說,我們稱之為覆寫。在編程語言中,那些名字相同參數(shù)類型不同的方法就叫做重載,那些分別處在子類父類里面名字相同參數(shù)類型也相同的方法叫做覆寫。1.2.6 具有面向?qū)ο笏枷胝Z言的優(yōu)勢傳統(tǒng)的程序設(shè)計(jì)方法稱為面向過程的程序設(shè)計(jì)方法,它是以具體的業(yè)務(wù)邏輯為基礎(chǔ),以實(shí)現(xiàn)方法為主要目的。它的缺點(diǎn)是:程序往往缺乏對代碼重用性的支持,并且缺乏統(tǒng)一的接口, 使得當(dāng)
30、代碼的規(guī)模達(dá)到一定程度時(shí),程序變得難以控制和管理,它的復(fù)雜性大大增加了開發(fā)人員的工作量。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法以一種更接近人類一般思維的方式去看待世界,按照現(xiàn)實(shí)世界的特點(diǎn)來管理復(fù)雜的事物,它根據(jù)實(shí)際的情況把生活中的對象抽象成相應(yīng)的屬性和行為組成的實(shí)體,對象之間通過互相調(diào)用來協(xié)調(diào)工作。面向?qū)ο缶幊痰幕締卧穷悾粋€(gè)類描述了對象的特性,并把數(shù)據(jù)和操作數(shù)據(jù)的行為(稱為方法)封裝在一起。類可看成是對象的模板,基于這些模板我們可以派生出具體的對象,我們的工作就是把它們有條不紊地組織在一起。而且這樣的組織方式更加符合人類認(rèn)知世界的過程。我們把現(xiàn)實(shí)世界中的事物,根據(jù)它們的特征和關(guān)系定義到了我們的系統(tǒng)中,方
31、便了操作和管理。面向?qū)ο蟮恼Z言大大提高了程序的重用性,降低了程序的復(fù)雜度,使得計(jì)算機(jī)可以處理更復(fù)雜的應(yīng)用需求。Java不僅具備面向?qū)ο笳Z言的所有特征,而且相對于別的面向?qū)ο蟮恼Z言,它還屏蔽了許多繁瑣的操作,簡化了難度,降低了開發(fā)人員的學(xué)習(xí)曲線,在面向?qū)ο蟮木幊填I(lǐng)域中占有舉足輕重的地位。1.3 開發(fā)我們的第一個(gè)Java程序 JDK是Java語言的開發(fā)環(huán)境,它全稱是Java Development Kit,意思為“Java開發(fā)包”,在本書里,我們采用目前最新的JDK1.6版本來開發(fā)Java代碼。根據(jù)大多數(shù)程序員的經(jīng)驗(yàn),配置Java開發(fā)環(huán)境,特別是配置Java的Eclipse集成開發(fā)環(huán)境,不是一件特
32、別容易的事情,所以,大家一定要先按照本章里給出的配置JDK和Eclipse等步驟,在開發(fā)環(huán)境準(zhǔn)確無誤的前提下,開始編寫我們的第一個(gè)Java代碼。1.3.1 如何配置Java的開發(fā)環(huán)境 下載和安裝JDKJDK1.6的安裝程序可以從Sun公司的網(wǎng)站下載完成后,我們可以根據(jù)提示信息,開始JDK1.6的安裝。安裝的過程中,我們約定安裝在C:Javajdk1.6.0目錄下。安裝結(jié)束之后,安裝程序會再次要求我們確認(rèn)安裝路徑,此時(shí)可以按安裝路徑C:Javajdk1.6.0來填寫。JDK環(huán)境安裝完成之后,建議大家重新啟動電腦。安裝完成之后,我們還需要設(shè)置環(huán)境變量。 設(shè)置JDK的環(huán)境
33、變量右擊桌面上的“我的電腦”圖標(biāo),在彈出的菜單選項(xiàng)里選擇“屬性”,由此打開Windows系統(tǒng)的屬性頁面,在其中選擇“高級”頁簽,單擊“環(huán)境變量”按鈕,打開設(shè)置頁面,如圖1-4所示。圖1-4 環(huán)境變量設(shè)置我們在“系統(tǒng)變量”的列表中尋找JAVA_HOME變量,如果沒有找到,可以通過單擊“新建”按鈕,新建JAVA_HOME變量,如圖1-5所示。圖1-5 新建環(huán)境變量示意圖現(xiàn)在我們可以配置JAVA_HOME,變量值為剛剛安裝JDK的目錄C:Javajdk1.6.0。用這個(gè)變量,我們可以設(shè)置后面的JDK的classpath和path環(huán)境。按同樣的方法,我們可以分別設(shè)置Path和classpath這兩個(gè)環(huán)
34、境變量,同樣地,如果該變量存在,則在變量值的最后添加,反之則直接添加。添加的Path變量值為:“%JAVA_HOME%bin;%JAVA_HOME%lib;”,添加完成后,如果我們在命令行里運(yùn)行“Javac”等JDK命令,系統(tǒng)會自動地到上述路徑里去查找Javac.exe。添加的classpath變量值為:“%JAVA_HOME%lib;”,即系統(tǒng)會自動地到這個(gè)環(huán)境下查找Java的開發(fā)包。 安裝Eclipse如果在開發(fā)Java項(xiàng)目的過程中,所有的代碼都用文本編輯器編寫,效率將會十分低下,所以,我們需要一個(gè)集開發(fā)編譯運(yùn)行于一體的集成開發(fā)環(huán)境。Eclipse是Java理想的集成開發(fā)環(huán)境
35、,它擁有非常方便的代碼編寫和編譯運(yùn)行等功能,同時(shí)也可以方便地添加各種針對JSP等的擴(kuò)展API包,所以是比較流行的Java開發(fā)工具。我們可以從Eclipse的官方網(wǎng)址/downloads/上獲得它的安裝包,目前最新的版本為Eclipse SDK 3.2.1。Eclipse同樣有多種針對不同操作系統(tǒng)的下載版本,我們這里同樣選擇Windows版本。(請大家注意,目前Windows版本并不支持最新的Vista系統(tǒng)。)下載之后的Eclipse安裝包是個(gè)Zip文件,它不需要安裝,直接解壓縮到指定的目即可以使用。我們約定解壓縮的目錄為:D:eclipse目錄。解壓縮
36、完成之后,運(yùn)行D:eclipseeclipse.exe文件即可以啟動Eclipse程序。Eclipse啟動之后會根據(jù)系統(tǒng)信息自動配置JDK環(huán)境,所以不用手動設(shè)置。 添加Eclipse的中文插件通過剛才的方式,我們得到的是英文版的Eclipse,為了提高開發(fā)效率,我們最好需要一個(gè)中文插件包。在網(wǎng)址/eclipse/downloads/下我們可以找到Eclipse的語言包“3.2.1_ Language_Packs”。根據(jù)提示信息,我們可以下載NLpack1-eclipse-SDK-3.2.1-win32.zip 文件。我
37、們將其解壓為兩個(gè)文件夾:features文件夾和plugins文件夾,完成后,將這兩個(gè)文件夾里面的內(nèi)容分別復(fù)制到Eclipse的對應(yīng)目錄中。如果復(fù)制的時(shí)候存在同名目錄,則覆蓋它。復(fù)制完成之后,到D:eclipseconfiguration文件夾中,將除了config.ini 文件以外的所有文件或文件夾刪除。當(dāng)我們再次重新運(yùn)行Eclipse之后,就能看到中文版的開發(fā)界面了。1.3.2 編寫HelloWorld程序按照剛才的步驟安裝配置完JDK環(huán)境后,我們就可以開始編寫第一個(gè)Java程序。我們第一個(gè)Java程序?qū)⒂脗鹘y(tǒng)的“文本編輯器”加“命令行”的開發(fā)和運(yùn)行方式。雖然這有些簡陋,但只有理
38、解了這種開發(fā)和運(yùn)行的原理,我們才能更好地使用Eclipse等集成開發(fā)環(huán)境。我們在C盤根目錄之下建立一個(gè)“HelloWorld.java”的文件,請注意這里的大小寫必須完全一致。然后用記事本或其他文本工具編輯這個(gè)文件,代碼如下:public class HelloWorld /代碼從這里開始執(zhí)行起public static void main(String args) /輸出語句System.out.println("Hello World"); 這段代碼主要是通過System.out.println語句,輸出Hello World語句。從中,我們可以看到Java語言有如下三
39、個(gè)基本特性:1. Java的所有代碼包含在一個(gè)class里,這個(gè)class是我們即將要講述的“類”,這個(gè)類名必須要和文件名一致,連大小寫也要完全相同,并且,它的前綴必須是public,表示這個(gè)類是公共的。2. Java代碼是從main函數(shù)開始執(zhí)行起。3. 代碼里,可以用“/”來編寫注釋,如果要編寫多行注釋,可以用“/* 注釋語句 */”的方式。另外,我們在編寫Java代碼時(shí),為了讓代碼具有良好的可讀性,編寫代碼的時(shí)候必須要遵循體現(xiàn)在上述代碼中的良好的編碼風(fēng)格,這些風(fēng)格主要包括:1. 類和方法必須要用 包含起來,并且,這對大括號必須要對齊。2. 必須要注意代碼的縮進(jìn),比如編寫類里的main函數(shù)時(shí)
40、,我們縮進(jìn)了兩格,而在編寫main函數(shù)里的具體代碼時(shí),我們同樣縮進(jìn)了兩格,這樣的風(fēng)格是非常利于體現(xiàn)代碼的層次關(guān)系的。3. 為了讓其他讀代碼的人能方便無誤地閱讀理解代碼,也為了自己日后能更方便地修改代碼,所以在代碼里要適當(dāng)?shù)囟鄬扅c(diǎn)注釋語句。1.3.3 運(yùn)行HelloWorld程序我們打開“開始菜單”,點(diǎn)擊其中的“運(yùn)行”選項(xiàng),輸入“cmd”命令,啟動命令行窗口,進(jìn)入C盤根目錄,在其中依次輸入命令代碼javac HelloWorld.java。這里,javac命令用來把java文件編譯為字節(jié)碼的.class文件,執(zhí)行完此命令后,會在C盤根目錄下出現(xiàn)HelloWorld.class文件。如果顯示出錯(cuò)信息,請大家檢查是否在輸入程序的時(shí)候出現(xiàn)了錯(cuò)誤,在確保編譯成功后,我們繼續(xù)運(yùn)行java HelloWorld命令,如果在命令行里能顯示“HelloWor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 知識產(chǎn)權(quán)廠房租賃合同補(bǔ)充協(xié)議書
- 滄州租賃房屋租金調(diào)整及支付方式協(xié)議
- 國際貨運(yùn)代理及倉儲管理合同
- 車庫租賃合同范本及車位租賃合同變更
- 2025-2030中國液態(tài)鋁電解電容器行業(yè)發(fā)展?fàn)顩r與需求規(guī)模預(yù)測報(bào)告
- 農(nóng)業(yè)金融科技融合-洞察及研究
- 植物蛋白腎臟保護(hù)-洞察及研究
- 高效阻燃氟化聚合物的性能調(diào)控與應(yīng)用前景研究-洞察闡釋
- 視頻目標(biāo)檢測與行為分析的深度學(xué)習(xí)方法-洞察闡釋
- 2025-2030中國枸櫞酸鉍鉀顆粒行業(yè)競爭狀況及投資潛力分析報(bào)告
- 延期交房起訴狀開發(fā)商違約金起訴狀
- 心內(nèi)科用藥安全管理課件
- GB/T 20453-2022柿子產(chǎn)品質(zhì)量等級
- 贛美2011版三年級美術(shù)下冊《瓜果飄香》教案及教學(xué)反思
- 維修改造工程施工組織設(shè)計(jì)
- 執(zhí)行力案例分享與解析課件
- 電路理論知到章節(jié)答案智慧樹2023年同濟(jì)大學(xué)
- 新版心肺復(fù)蘇流程圖
- 與食品安全相關(guān)的組織機(jī)構(gòu)設(shè)置、部門職能和崗位職責(zé)
- 法院送達(dá)地址確認(rèn)書
- 項(xiàng)目管理手冊(最終完成版)
評論
0/150
提交評論