“開發(fā)寶典叢書”是由清華大學出版社為軟件開發(fā)愛好者精心打造的一套軟件開發(fā)百科全書。叢書強調“全面、新穎、詳細、實用、深入、高效”等特色,涵蓋常見的編程語言和技術。叢書中的每本書都是由從事軟件開發(fā)多年、具備豐富的開發(fā)經(jīng)驗的老手精心編寫,講解細膩,內(nèi)容實用,并精心錄制了配套教學視頻?梢哉f,這套叢書是編程愛好者系統(tǒng)學習軟件開發(fā)技術的不二選擇,一冊在手,萬事無憂!
《Java編程實戰(zhàn)寶典》以J2SE為平臺,以最新的JDK1。7技術規(guī)范為切入點,全面、系統(tǒng)地介紹了Java的基礎編程技術和常用開發(fā)方法。書中的各個技術點都提供了實例以供讀者實戰(zhàn)演練,各章最后還提供了實戰(zhàn)練習題以幫助讀者鞏固和提高。本書配1張DVD光盤,內(nèi)容為書中涉及的實例源文件及作者專門為本書錄制的配套教學視頻,以幫助讀者更加高效、直觀地學習本書內(nèi)容。另外,光盤中還贈送了大量的Java范例、模塊及項目案例開發(fā)的源程序和教學視頻,非常超值。
本書共22章,分為8篇。首先講述了Java的基礎語法,然后介紹了Java中類和對象的實現(xiàn),這也是Java的核心所在。隨后介紹了Java中的高級技術,詳細討論了其中的多線程、集合、泛型和RTTI等。這些基本知識介紹完畢之后,就進入實際編程階段,先后介紹了GUI程序設計、多媒體程序設計、數(shù)據(jù)庫和網(wǎng)絡程序設計,這些知識均以示例程序來講解。最后用3章的篇幅介紹了一個完整的即時通信軟件設計實例,讓讀者能夠從實例中學習程序設計的真諦(因篇幅所限,此3章內(nèi)容以PDF電子文檔的格式收錄于本書的配書光盤中)。
本書內(nèi)容全面,實例豐富,特別適合想全面自學Java開發(fā)技術的人員閱讀,也適合使用Java進行開發(fā)的工程技術人員和科研人員閱讀。對于Java程序員,本書更是一本不可多得的案頭必備參考手冊。另外,本書也可作為計算機和軟件工程等專業(yè)的教材和教學參考書。
超值、大容量DVD光盤
本書實例源文件
18小時配套教學視頻
23小時Java開發(fā)實例教學視頻
4個Java項目案例源程序及3小時教學視頻
100頁本書第8篇內(nèi)容的電子書
355頁《Java程序員面試寶典》電子書
一分鐘了解本書精華內(nèi)容
Java的開發(fā)運行環(huán)境(57分鐘視頻)
Java語言基礎(75分鐘視頻)
對象和類(33分鐘視頻)
繼承與多態(tài)(35分鐘視頻)
數(shù)組與字符串(69分鐘視頻)
Java的異常處理(58分鐘視頻)
Java輸入輸出處理技術(110分鐘視頻)
Java的多線程機制(83分鐘視頻)
運行時類型識別(37分鐘視頻)
泛型(18分鐘視頻)
Java集合框架(20分鐘視頻)
類型包裝器、自動裝箱和元數(shù)據(jù)(21分鐘視頻)
常用工具類(74分鐘視頻)
GUI程序設計(29分鐘視頻)
Java多媒體編程應用(16分鐘視頻)
數(shù)據(jù)庫基礎(47分鐘視頻)
Java數(shù)據(jù)庫編程技術(110分鐘視頻)
Java網(wǎng)絡編程技術(78分鐘視頻)
JSP程序設計(42分鐘視頻)
即時通訊系統(tǒng)開發(fā)項目實戰(zhàn)(71分鐘視頻)
一本百科全書式的Java編程秘笈,全面、新穎、詳細、深入和實用
資深程序員15年開發(fā)經(jīng)驗的總結,完美展現(xiàn)Java應用開發(fā)的精髓
18小時配套教學視頻 + 26小時進階教學視頻,贈送100頁本書項目案例開發(fā)電子書及355頁《Java程序員面試寶典》電子書
全面:涵蓋Java基礎語法、面向對象、多線程、集合、泛型、GUI編程、多媒體編程、數(shù)據(jù)庫編程和網(wǎng)絡編程等內(nèi)容
新穎:以當前最流行的JDK 1.7進行講解,詳細介紹了大量的新技術和新功能
詳細:結合圖示,從概念、語法、示例、技巧和應用等多角度分析每個知識點
實用:提供了450個實例、6個小案例、1個項目開發(fā)案例、346個習題
深入:深入剖析Swing包、實用工具類、集合、泛型等其他書中很少透徹介紹的內(nèi)容
高效:提供了18小時配套教學視頻及26小時Java進階視頻,高效而直觀
Java是目前最為流行的程序開發(fā)語言。市面上介紹Java的書籍很多,既包括國外的經(jīng)典名著,也包括國內(nèi)各種各樣的教學書籍。國外名著由于知識背景的差異,作者的思維方式總是和中國讀者有一定的距離,因此剛入門的讀者無法領略其中的精妙。大多數(shù)國外書籍,則將Java當作純粹的語言來介紹,忽視了它作為一個應用平臺的強大威力,讀者看了之后,難免會誤會Java不過是一個精簡版的C++。
筆者在多年的教學和開發(fā)實踐中,深感需要編寫一本既能讓初學者快速入門,又能真正利用Java進行軟件開發(fā)的指導性書籍。幾年前筆者就萌生了一個想法:親自編寫一本既適合讀者自學,又可供教學參考的Java圖書。而真正付諸實施,這本書花了筆者近一年的時間。筆者在自己平時所用課件的基礎上,進行了大量增改,終于編寫出了本書。本書以J2SE為平臺,以最新的JDK 1.7技術規(guī)范為切入點,由淺入深、循序漸進地介紹了有關 J2SE平臺下的大部分常用開發(fā)技術。書中的每個知識點和技術都采用了實例講解為主、理論分析為輔的方式進行介紹。
本書假設讀者沒有任何編程經(jīng)驗,舉例時也盡量避免復雜的數(shù)據(jù)結構和算法設計。每個例子都著重于Java知識點本身,盡量淺顯易懂,不涉及其他知識。對于初學者易犯的錯誤,都有明確的提示。為了讓讀者養(yǎng)成良好的編程習慣,本書的程序代碼均按照軟件工程的規(guī)范來編寫。全書講解時配合了大量的程序示例、實用程序、圖例及代碼說明,所有程序代碼筆者均仔細調試過,確保準確無誤。
本書特色
本書是根據(jù)筆者多年的教學和軟件開發(fā)經(jīng)驗總結出來的,將知識范圍鎖定在了適合初、中級讀者閱讀的部分。本書以大量的實例進行示范和解說,其特點主要體現(xiàn)在以下幾個方面。
* 內(nèi)容全面,涵蓋廣泛:本書全面涵蓋了Java的基礎語法、面向對象編程、Java高級技術中的多線程、集合、泛型和RTTI等,而且系統(tǒng)介紹了GUI程序設計、多媒體程序設計、數(shù)據(jù)庫程序設計和網(wǎng)絡程序設計等。
* 技術最新,緊跟趨勢:本書以最新的JDK 1.7技術規(guī)范為切入點進行講解,詳細介紹了新版本的各種新技術和新功能,讓讀者了解和掌握最新的Java技術。
* 由淺入深,循序漸進:本書的編排采用了由淺入深、循序漸進的方式,使得初、中級讀者都可以容易地掌握復雜的編程技術。
* 實例豐富,講解詳細:本書提供了大量的示例和實例,并按照“知識點→例或實例→示例或實例解析→運行效果→貼心提示”的模式講解,理解起來非常容易。書中給出了這些例子的詳細源代碼,并對代碼進行了詳細注釋,還對例子的重點和難點進行了詳細的講解和分析。書中的例子簡潔規(guī)范,能讓讀者專心于知識點,而不被其他事情所干擾。它們大多具有實際意義,著重于解決工作中的實際問題,可幫助讀者理解和上機模擬實踐。
* 案例精講,注重實戰(zhàn):本書最后用3章的篇幅詳細介紹了一個完整的即時通信軟件項目案例的設計和實現(xiàn)過程,讓讀者體驗實際的項目開發(fā),提升開發(fā)水平。
* 實踐練習,鞏固提高:本書各章都提供了實踐練習題,讀者每閱讀完一章,可以通過完成這些練習題來檢測自己的學習效果,從而達到鞏固和提高的目的。
* 視頻教學,光盤超值:筆者專門錄制了大量的配套多媒體教學視頻,便于讀者更加高效、直觀地學習。另外,配書光盤中還贈送了大量的Java開發(fā)范例、模塊和案例的源程序及教學視頻庫,并提供了一部《Java程序員面試寶典》電子書。
本書內(nèi)容安排
本書共22章,分為8篇,不僅包含了Java的基礎知識,也對它的高級技術和實用技術做了詳細介紹。
第1篇 Java基礎知識入門(第1、2章)
本篇首先全面介紹了Java的運行開發(fā)環(huán)境。其中詳細講解了JDK的安裝和配置,如何使用UltraEdit來編輯一個Java源程序,以及如何編譯和運行Java程序。第2章介紹了Java的基礎知識,包括數(shù)據(jù)類型、運算符與表達式、流程控制等。最后以幾個實例來引導讀者步入程序設計的大門。這一篇是整個Java程序設計的基礎。
第2篇 對象和類(第3、4章)
本篇介紹了如何使用Java來進行面向對象的程序設計。包括對象和類的成員定義與使用、單繼承和多重繼承、運行時多態(tài)、接口、內(nèi)部類、包等。本篇是Java的精華,也是學習Java面向對象技術必備的知識。
第3篇 數(shù)據(jù)處理(第5~7章)
本篇介紹了Java中的數(shù)據(jù)處理。首先介紹了Java中的兩個特殊類:數(shù)組和字符串。然后介紹了Java中的異常處理機制。最后介紹了輸入和輸出,包括標準設備的輸入和輸出以及文件的處理,還對新版JDK 1.7中有關Java輸入與輸出新增技術進行了說明。學完本篇,已經(jīng)可以編寫一些實用程序了。
第4篇 Java中的高級技術(第8~13章)
本篇介紹了Java中的高級技術,包括多線程、RTTI、泛型、集合、類型包裝以及實用工具類等。這些內(nèi)容是編寫復雜實用程序的基礎。使用這些高級技術,可以大大降低編程的煩瑣程度和難度。
第5篇 GUI程序設計(第14、15章)
本篇介紹了普通窗口程序和多媒體程序的編寫。GUI是目前最為流行的程序界面,但這類程序的編制比普通控制臺程序要復雜一些。本篇詳細介紹了和GUI有關的事件、布局管理以及各種組件的使用。并通過大量的實例來介紹如何編寫一個實用的桌面程序,以及編程中的常用技巧和應該注意的問題。在多媒體程序設計中,則著重介紹了各種文字、圖像、聲音和視頻的處理。在編程中,應盡量使用Java自己提供的類,以降低編程的難度。
第6篇 數(shù)據(jù)庫程序設計(第16、17章)
本篇介紹了數(shù)據(jù)庫程序設計。數(shù)據(jù)庫編程是Java的一個重要應用方面。本篇先介紹一般性的數(shù)據(jù)庫理論,主要是SQL語句的使用。然后詳細介紹了如何使用Java中的各種類來處理數(shù)據(jù)庫,并提供了一個實例來說明編寫數(shù)據(jù)庫程序與普通程序的一些差別。
第7篇 Java網(wǎng)絡程序開發(fā)(第18、19章)
本篇介紹了網(wǎng)絡程序設計。首先介紹一般的C/S模式的網(wǎng)絡程序設計,主要是利用Socket進行網(wǎng)絡通信。隨后介紹了JSP程序設計,這是Java應用的又一重要領域。另外,本篇提供了5個實例來說明JSP程序設計中應該注意的一些問題。
第8篇 即時通信系統(tǒng)開發(fā)項目實戰(zhàn)(第20~22章)
本篇講解了一個以QQ為原型的Java版即時通信系統(tǒng)的應用開發(fā)案例,綜合使用了Java中的桌面程序設計、圖像處理、數(shù)據(jù)庫處理以及網(wǎng)絡通信中的各種技術,以及軟件工程的思想,對Java應用系統(tǒng)從架構設計、數(shù)據(jù)設計到編碼開發(fā)都進行了細致的講解。最后兩章是對Java技術的一個全面應用綜合演練。通過這個軟件,讀者可以領略到Java的強大實用編程能力。因篇幅所限,本篇內(nèi)容以PDF電子文檔的格式收錄于本書的配套光盤中。
本書光盤內(nèi)容
* 本書各章涉及的實例源文件;
* 18小時本書配套教學視頻;
* 23小時Java開發(fā)實例教學視頻;
* 4個Java項目案例源程序及3小時教學視頻;
* 100頁本書第8篇內(nèi)容的電子書;
* 355頁《Java程序員面試寶典》電子書。
適合閱讀本書的讀者
* 想全面學習Java開發(fā)技術的人員;
* 沒有任何編程基礎的計算機專業(yè)的學生;
* 具備一定自學能力的Java編程愛好者;
* 利用Swing開發(fā)桌面程序的Java程序員;
* 進行JSP網(wǎng)站開發(fā)的人員;
* 使用C/S模式設計網(wǎng)絡程序的Java程序員;
* 想了解Java中、高級技術的編程人員;
* 使用Java做開發(fā)的工程技術人員和科研人員;
* 大中專院校Java語言的教學人員;
* 需要案頭必備手冊的Java程序員。
本書作者
本書由劉新和管磊主筆編寫。其他參與編寫的人員有陳小云、陳曉梅、陳欣波、陳智敏、崔杰、戴晟暉、鄧福金、董改香、董加強、杜磊、杜友麗、范祥、方家娣、房健、付青、傅志輝、高德明、高雁翔、宮虎波、古超、桂穎、郭剛、郭立峰、郭秋滟、韓德、韓花、韓加國、韓靜、韓偉、何海訊、衡友躍、李寧、李錫江、李曉峰、劉建準。
本書的編寫對筆者而言是一個“浩大的工程”。雖然筆者投入了大量的精力和時間,但只怕百密難免一疏。若讀者在閱讀本書時發(fā)現(xiàn)任何疏漏,希望能及時反饋給我們,以便及時更正。聯(lián)系我們請發(fā)郵件。
最后祝各位讀者讀書快樂,學習進步!
編者
劉新,計算機軟件與理論專業(yè)碩士,現(xiàn)為湘潭大學信息工程學院教師,副教授。從事計算機專業(yè)教學11年。主要講授《Java程序設計語言》、《Java應用技術》、《C語言程序設計》、《數(shù)據(jù)結構》、《算法設計與分析》等專業(yè)課程。先后參與過10多個系統(tǒng)的開發(fā)工作,其中包括解放軍報全文檢索系統(tǒng)、新聞出版報全文檢索系統(tǒng)、警務管理系統(tǒng)、MARC數(shù)據(jù)編輯軟件、MARC數(shù)據(jù)到XML數(shù)據(jù)轉換系統(tǒng)、Z39。50客戶端瀏覽軟件、路橋收費及稽查系統(tǒng)等。尤其擅長Java開發(fā)。
管磊,畢業(yè)于北京工業(yè)大學,計算機技術專業(yè)碩士,系統(tǒng)架構師,出版過《P2P技術揭秘——P2P網(wǎng)絡技術原理與典型系統(tǒng)開發(fā)》,有多個軟件著作權和發(fā)明專利。現(xiàn)就職于公安部第一研究所,從事應用系統(tǒng)體系架構設計方面的工作,對Java編程方法、語言機制、性能優(yōu)化、Java開源應用框架等有較深入的研究。
第1篇 Java基礎知識入門
第1章 Java的開發(fā)運行環(huán)境( 教學視頻:57分鐘)
1.1 Java運行原理與Java虛擬機
1.1.1 Java運行原理簡述
1.1.2 Java虛擬機
1.2 Java的開發(fā)環(huán)境
1.2.1 JDK的安裝
1.2.2 如何設置系統(tǒng)環(huán)境變量
1.2.3 JDK安裝后的測試與驗證
1.2.4 編譯命令的使用
1.2.5 解釋執(zhí)行命令的使用
1.2.6 UltraEdit的使用
1.3 Java應用程序示例
1.4 Java Applet程序示例
1.5 本章小結
1.6 實戰(zhàn)習題
第2章 Java語言基礎( 教學視頻:75分鐘)
2.1 Java語言的關鍵特性
2.2 Java程序的構成及文本風格
2.2.1 Java程序的構成
2.2.2 Java的代碼結構
2.2.3 Java程序的格式編排
2.2.4 Java代碼的注釋風格
2.3 數(shù)據(jù)類型
2.3.1 基本數(shù)據(jù)類型
2.3.2 常量
2.3.3 變量
2.3.4 整型數(shù)據(jù)
2.3.5 浮點型數(shù)據(jù)
2.3.6 字符型數(shù)據(jù)
2.3.7 布爾型數(shù)據(jù)
2.3.8 變量賦初值
2.3.9 變量的作用域
2.3.10 數(shù)據(jù)類型轉換
2.4 運算符與表達式
2.4.1 算術運算符和算術表達式
2.4.2 關系運算符和關系表達式
2.4.3 邏輯運算符和邏輯表達式
2.4.4 條件運算符和條件表達式
2.4.5 位運算符和位表達式
2.4.6 賦值運算符和賦值表達式
2.4.7 表達式的求值順序
2.5 流程控制語句
2.5.1 3種基本控制結構
2.5.2 表達式語句和空語句
2.5.3 塊語句
2.5.4 if~else分支語句
2.5.5 多路分支switch~case語句
2.5.6 當型循環(huán)while語句
2.5.7 直到型循環(huán)do~while語句
2.5.8 當型循環(huán)for語句
2.5.9 增強的for循環(huán)
2.5.10 循環(huán)的嵌套
2.5.11 跳轉語句break
2.5.12 跳轉語句continue
2.6 Java基礎語法實戰(zhàn)演習
2.6.1 判斷閏年
2.6.2 求最大公約數(shù)和最小公倍數(shù)
2.6.3 Fibonacci數(shù)列
2.6.4 逆向輸出數(shù)字
2.6.5 求水仙花數(shù)
2.6.6 輸出圖形
2.6.7 輸出九九口訣表
2.7 本章小結
2.8 實戰(zhàn)習題
第2篇 Java面向對象編程
第3章 對象和類( 教學視頻:33分鐘)
3.1 什么是面向對象
3.1.1 對象的理解
3.1.2 什么是類
3.1.3 消息的定義
3.1.4 面向對象的基本特征
3.2 類與對象
3.2.1 類的基本結構
3.2.2 類的聲明
3.2.3 創(chuàng)建類體
3.2.4 對象的生命周期
3.2.5 對象的創(chuàng)建
3.2.6 對象的使用
3.3 成員變量的定義與使用
3.3.1 成員變量的定義
3.3.2 成員變量的訪問權限
3.3.3 實例成員變量和靜態(tài)成員變量
3.4 方法的定義和實現(xiàn)
3.4.1 方法的聲明
3.4.2 創(chuàng)建方法體與return語句
3.4.3 局部變量和成員變量的區(qū)別
3.4.4 方法的訪問權限
3.5 方法的調用
3.5.1 方法調用的形式
3.5.2 方法調用的參數(shù)
3.5.3 隱含參數(shù)this
3.6 構造方法
3.6.1 無參數(shù)構造方法的定義和使用
3.6.2 帶參數(shù)構造方法的定義和使用
3.6.3 this關鍵字和構造方法的調用
3.7 靜態(tài)方法
3.7.1 靜態(tài)方法的聲明和定義
3.7.2 靜態(tài)方法和實例方法的區(qū)別
3.7.3 靜態(tài)代碼塊
3.7.4 再論靜態(tài)成員變量
3.8 main()方法和命令行參數(shù)
3.9 終結處理與垃圾回收
3.9.1 對象的釋放和垃圾收集機制
3.9.2 finalize()終結處理方法
3.9.3 Java垃圾回收的工作原理
3.10 本地方法
3.11 本章小結
3.12 實戰(zhàn)習題
第4章 繼承與多態(tài)( 教學視頻:35分鐘)
4.1 繼承的概念
4.1.1 繼承的基本原理
4.1.2 Java繼承的特征
4.1.3 Java中子類繼承父類的描述及實現(xiàn)
4.1.4 Java繼承的內(nèi)存形態(tài)
4.2 繼承中屬性隱藏與方法覆蓋
4.2.1 屬性的隱藏
4.2.2 方法的覆蓋
4.3 構造方法的繼承與調用
4.3.1 構造方法的繼承
4.3.2 super關鍵字的使用
4.3.3 關于子類繼承父類的總結
4.4 多態(tài)技術
4.4.1 Java中的多態(tài)
4.4.2 重載與覆蓋
4.4.3 運行時多態(tài)
4.5 接口與多重繼承
4.5.1 接口的定義
4.5.2 接口的繼承
4.5.3 接口的實現(xiàn)
4.6 Java抽象類與最終類
4.6.1 抽象類與抽象方法
4.6.2 最終類與最終方法
4.7 Java內(nèi)部類
4.7.1 內(nèi)部類的定義
4.7.2 內(nèi)部類訪問外部類的成員
4.7.3 內(nèi)部類之間的相互使用
4.7.4 在外部使用內(nèi)部類
4.7.5 匿名內(nèi)部類
4.7.6 內(nèi)部類的作用
4.8 Java包:庫單元
4.8.1 包的創(chuàng)建
4.8.2 包的使用
4.8.3 JAR文件的創(chuàng)建和使用
4.8.4 JDK中的常用包
4.9 本章小結
4.10 實戰(zhàn)習題
第3篇 Java數(shù)據(jù)處理
第5章 數(shù)組與字符串( 教學視頻:69分鐘)
5.1 數(shù)組
5.1.1 一維數(shù)組的聲明
5.1.2 一維數(shù)組的創(chuàng)建
5.1.3 一維數(shù)組的使用
5.1.4 二維數(shù)組的聲明
5.1.5 二維數(shù)組的創(chuàng)建
5.1.6 二維數(shù)組的使用
5.1.7 程序示例1——數(shù)組排序
5.1.8 程序示例2——楊輝三角
5.2 字符串
5.2.1 String對象的聲明
5.2.2 String對象的創(chuàng)建
5.2.3 String對象的使用
5.2.4 String類型的數(shù)組
5.2.5 StringBuffer對象的聲明
5.2.6 StringBuffer對象的創(chuàng)建
5.2.7 StringBuffer對象的使用
5.3 本章小結
5.4 實戰(zhàn)習題
第6章 Java的異常處理( 教學視頻:58分鐘)
6.1 異常與異常處理
6.1.1 異常的特點
6.1.2 異常處理的兩種模型
6.1.3 異常處理在編程中的優(yōu)點
6.2 Java的異常處理
6.2.1 Java的異常處理機制
6.2.2 Java異常類的層次結構
6.2.3 Java異常的分類
6.2.4 Java異常處理的原則
6.3 Java異常處理實踐
6.3.1 Java異常捕獲與處理
6.3.2 異常的拋出
6.3.3 異常的嵌套處理
6.3.4 自定義異常及其處理方法
6.3.5 Java異常處理的應用示例
6.4 本章小結
6.5 實戰(zhàn)習
第7章 Java輸入輸出處理技術( 教學視頻:110分鐘)
第4篇 Java中的高級技術
第8章 Java的多線程機制( 教學視頻:83分鐘)
第9章 運行時類型識別( 教學視頻:37分鐘)
第10章 泛型( 教學視頻:18分鐘)
第11章 Java集合框架( 教學視頻:20分鐘)
第12章 類型包裝器、自動裝箱和元數(shù)據(jù)( 教學視頻:21分鐘)
第13章 常用工具類( 教學視頻:74分鐘)
第5篇 桌面程序開發(fā)
第14章 GUI程序設計( 教學視頻:29分鐘)
第15章 Java多媒體編程應用( 教學視頻:16分鐘)
第6篇 數(shù)據(jù)庫程序設計
第16章 數(shù)據(jù)庫基礎( 教學視頻:47分鐘)
第17章 Java數(shù)據(jù)庫編程技術( 教學視頻:110分鐘)
第7篇 Java網(wǎng)絡程序開發(fā)
第18章 Java網(wǎng)絡編程技術( 教學視頻:78分鐘)
第19章 JSP程序設計( 教學視頻:42分鐘)
*第8篇 即時通信系統(tǒng)開發(fā)項目實戰(zhàn)
第20章 系統(tǒng)分析和設計( 教學視頻:27分鐘)
第21章 服務器端功能模塊的實現(xiàn)( 教學視頻:19分鐘)
第22章 客戶端功能模塊的實現(xiàn)( 教學視頻:25分鐘)
說明:因篇幅所限,第8篇內(nèi)容以PDF電子文檔的格式收錄于本書的配書光盤中贈送給讀者,讀者可以選擇閱讀。該項目案例涉及的源程序及視頻講解也收錄于配書光盤中。
第3 章 對 象 和 類
在當今的計算機大型應用軟件開發(fā)領域,面向對象技術正在逐步取代面向過程的程序設計技術。本章將介紹面向對象的基本知識和Java 實現(xiàn)面向對象程序設計的主要工具——類。如果讀者缺乏關于面向對象程序設計的背景,一定要仔細閱讀本章。如果讀者有C++編程經(jīng)驗,也要注意二者之間的區(qū)別,畢竟Java 在類的具體實現(xiàn)上與C++有較大的差別。學習本章面向對象的相關知識,主要內(nèi)容有以下幾點:
面向對象的基本概念;
對象與類的理解;
成員變量的定義與使用;
方法的定義及實現(xiàn);
方法調用;
構造方法與靜態(tài)方法;
終結處理與垃圾回收。
3.1 什么是面向對象
面向對象(Object Oriented,OO)是當前計算機界關心的重點,它是20 世紀90 年代軟件開發(fā)方法的主流。面向對象的概念和應用已超越了程序設計和軟件開發(fā),擴展到很廣的范圍。例如,數(shù)據(jù)庫系統(tǒng)、交互式界面、應用結構、應用平臺、分布式系統(tǒng)、網(wǎng)絡管理結構、CAD 技術和人工智能等領域。面向對象是一種對現(xiàn)實世界理解和抽象的方法,是計算機編程技術發(fā)展到一定階段后的產(chǎn)物,它是相對于面向過程而言的。通過面向對象的方式,將現(xiàn)實世界的物抽象成對象,現(xiàn)實世界中的關系抽象成類、繼承等,以更直觀、清晰地完成對現(xiàn)實世界的抽象與數(shù)字建模。討論面向對象方面的文章非常多。但是,明確地給出“面向對象”的定義卻非常少。
最初,“面向對象”是專指在程序設計中采用封裝、繼承和抽象等設計方法?墒,這個定義顯然不能再適合現(xiàn)在的情況。面向對象的思想已經(jīng)涉及到軟件開發(fā)的各個方面。例如,面向對象的分析(Object Oriented Analysis,OOA)、面向對象的設計(Object Oriented Design,OOD)以及經(jīng)常說的面向對象的編程(Object Oriented Programming,OOP)。許多有關面向對象的文章,都只是講述在面向對象的開發(fā)中所需要注意的問題,或所采用的比較好的設計方法。看這些文章只有真正懂得什么是對象,什么是面向對象,才能最大程度地收獲知識。
?說明:在本章中,著重討論OOP,有關OOA 和OOD 請讀者查閱有關軟件工程的書籍。OOP 從所處理的數(shù)據(jù)入手,以數(shù)據(jù)為中心而不是以服務(功能)為中心來描述系統(tǒng)。它把編程問題視為一個數(shù)據(jù)集合,因為數(shù)據(jù)相對于功能而言,具有更強的穩(wěn)定性。OOP 同結構化程序設計相比最大的區(qū)別就在于:前者首先關心的是所要處理的數(shù)據(jù),而后者首先關心的是功能。在計算機編程中使用OOP 方法,更利于從人理解的方式對于復雜系統(tǒng)的進行分析、設計與編程。同時能有效提高編程的效率,通過封裝技術,消息機制可以像搭積木的一樣快速開發(fā)出一個全新的系統(tǒng)。
3.1.1 對象的理解
OOP 是一種圍繞真實世界的概念來組織模型的程序設計方法,它采用對象來描述問題空間的實體。可以說,“對象”這個概念是OOP 最本質的概念之一,在面向對象的編程過程中,首先根據(jù)客戶需求抽象出業(yè)務對象;然后對需求進行合理分層,構建相對獨立的業(yè)務模塊;之后設計業(yè)務邏輯,利用多態(tài)、繼承、封裝和抽象的編程思想,實現(xiàn)業(yè)務需求;最后通過整合各模塊,達到高內(nèi)聚、低耦合的效果,從而滿足客戶要求。但是,如何給“對象”下一個嚴謹?shù)亩x,卻是一個棘手的問題,目前還沒有統(tǒng)一的認識。
在現(xiàn)實生活中,一般認為對象是行動或思考時作為目標的各種事物。對象所代表的本體可能是一個物理存在,也可能是一個概念存在。例如一枝花、一個人、一項計劃等。在使用計算機解決問題時,對象是作為計算機模擬真實世界的一個抽象,一個對象就是一個物理實體或邏輯實體,它反映了系統(tǒng)為之保存信息和(或)與它交互的能力。
在計算機程序中,對象相當于一個“基本程序模塊”,它包含了屬性(數(shù)據(jù))和加在這些數(shù)據(jù)上的操作(行為)。對象的屬性是描述對象的數(shù)據(jù),屬性值的集合稱為對象的狀態(tài)。對象的行為則會修改這些數(shù)據(jù)值并改變對象的狀態(tài)。因此,在程序設計領域,可以用“對象=數(shù)據(jù)+作用于這些數(shù)據(jù)上的操作”這一公式來表達。
下面以一個生活中常見的例子來說明對象這個概念。例如“椅子”這個對象,它是“家具”這個更大的一類對象的一個成員。椅子應該具有家具所具有的一些共性,如:價格、重量和所有者等屬性。它們的值也說明了椅子這個對象的狀態(tài)。例如,價格為100 元,重量為5 公斤,所有者是小王等。類似地,家具中的桌子、沙發(fā)等對象也具有這些屬性。這些對象所包含的成分可以用圖3.1 來說明。
對象的操作是對對象屬性的修改。在面向對象的程序設計中,對象屬性的修改只能通過對象的操作來進行,這種操作又稱為方法。比如上面的對象都有“所有者”這一個屬性,修改該屬性的方法可能是“賣出”,一旦執(zhí)行了“賣出”操作,“所有者”這個屬性就會發(fā)生變化,對象的狀態(tài)也就發(fā)生了改變,F(xiàn)在的問題是,所有的對象都有可能執(zhí)行“賣出”操作,那么如何具體區(qū)分賣出了哪個對象,這是需要考慮的。面向對象的設計思路把“賣出”這個操作包含在對象里面,執(zhí)行“賣出”操作,只對包含了該操作的對象有效。因此,整個對象就會變成圖3.2 這個樣子。
由于對象椅子已經(jīng)包含了“賣出”操作,因此,當執(zhí)行“賣出”操作時,對象外部的使用者并不需要關心它的實現(xiàn)細節(jié),只需要知道如何來調用該操作,以及會獲得怎樣的結果就可以了,甚至不需要知道它到底修改了哪個屬性值。這樣做不僅實現(xiàn)了模塊化和信息隱藏,有利于程序的可移植性和安全性,也有利于對復雜對象的管理。圖3.1 對象的屬性集合 圖3.2 封裝了屬性和操作的對象
3.1.2 什么是類
“物以類聚”是人們區(qū)分、歸納客觀事物的方法。在面向對象系統(tǒng)中,人們不需要逐個去描述各個具體的對象,而是關注具有同類特性的一類對象,抽象出這樣一類對象共有的結構和行為,進行一般性描述,這就引出了類的概念。椅子、桌子、沙發(fā)等對象都具有一些相同的特征,由于這些相同的特征,它們可以歸為一類,稱為家具。因此,家具就是一個類,它的每個對象都有價格、重量及所有者這些屬性。也可以將家具看成是產(chǎn)生椅子、桌子、沙發(fā)等對象的一個模板。椅子、桌子、沙發(fā)等對象的屬性和行為都是由家具類所決定的。家具和椅子之間的關系就是類與類的成員對象之間的關系。類是具有共同屬性、共同操作的對象的集合。而單個的對象則是所屬類的一個成員,或稱為實例(instance)。在描述一個類時,定義了一組屬性和操作,而這些屬性和操作可被該類所有的成員所繼承,如圖3.3 所示。
圖3.3 由類到對象的繼承
圖3.3 表明,對象會自動擁有它所屬類的全部屬性和操作。正因為這一點,人們才會知道一種物品是家具時,主動去詢問它的價格、尺寸和材質等屬性。對于初學者而言,類和對象的概念最容易混淆。類屬于類型的范疇,用于描述對象的特性。對象屬于值的范疇,是類的實例。從集合的角度看,類是對象的集合,它們是從屬關系。也可以將類看成是一個抽象的概念,而對象是一個具體的概念。例如蘋果是一個類,而“桌子上的那個蘋果”則是一個對象。從編程的角度看,類和對象的關系可以看成是數(shù)據(jù)類型和變量的關系。還可以認為類是一個靜態(tài)的概念,而對象是一個動態(tài)的概念,它具有生命力。類和對象的關系可以用如圖3.4 所示這個實例來演示,如圖3.4 所示。
圖3.4 類與對象的關系
3.1.3 消息的定義
由上述內(nèi)容可知,對象的行為是通過其定義的一組方法來描述,對象的結構特征是由它的屬性來表現(xiàn)。但是,對象不會無緣無故地執(zhí)行某個操作,只有在接受了其他對象的請求之后,才會進行某一操作,這種請求對象執(zhí)行某一操作,或是回答某些信息的要求稱為消息。對象之間通過消息的傳遞來實現(xiàn)相互作用。消息一般有3 個組成部分:消息接收者(接收對象名)、接收對象應采用的方法以及方法所需要的參數(shù)。同時,接收消息的對象在執(zhí)行完相應的方法后,可能會給發(fā)送者返回一些信息。
例如,教師向學生布置作業(yè)“07 級計算機1 班做5 道習題”。其中,教師和學生都是對象,“07 級計算機1 班”是消息的接收者,“做習題”是要求目標對象——學生執(zhí)行的方法,“5 道”是要求對象執(zhí)行方法時所需要的參數(shù)。學生也可以向教師返回作業(yè)信息。這樣,對象之間通過消息機制,建立起了相互關系。由于任何一個對象的所有行為都可以用方法來描述,所以通過消息機制可以完全實現(xiàn)對象之間的交互。在Java 程序設計中,所需完成的功能任務就在對象之間的消息傳遞與相互作用之間完成。
3.1.4 面向對象的基本特征
在上述面向對象的基本概念基礎之上,不可避免地要涉及到面向對象程序設計所具有的4 個共同特征:抽象性、封裝性、繼承性和多態(tài)性。
1.抽象
抽象是人們認識事物的常用方法,比如地圖的繪制。抽象的過程就是如何簡化、概括所觀察到的現(xiàn)實世界,并為人們所用的過程。抽象是軟件開發(fā)的基礎。軟件開發(fā)離不開現(xiàn)實環(huán)境,但需要對信息細節(jié)進行提煉、抽象,找到事物的本質和重要屬性。抽象包括兩個方面:過程抽象和數(shù)據(jù)抽象。過程抽象把一個系統(tǒng)按功能劃分成若干個子系統(tǒng),進行“自頂向下逐步求精”的程序設計。數(shù)據(jù)抽象以數(shù)據(jù)為中心,把數(shù)據(jù)類型和施加在該類型對象上的操作作為一個整體(對象)來進行描述,形成抽象數(shù)據(jù)類型ADT。所有編程語言的最終目的都是提供一種“抽象”方法。一種較有爭議的說法是:解決問題的復雜程度直接取決于抽象的種類及質量。其中,“種類”是指準備對什么進行“抽象”。匯編語言是對基礎機器的少量抽象。后來的許多“命令式”語言(如FORTRAN、BASIC 和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了較大的進步,但它們的抽象原理依然要求程序設計者著重考慮計算機的結構,而非考慮問題本身的結構。
在機器模型(位于“方案空間”)與實際解決的問題模型(位于“問題空間”)之間,程序員必須建立起一種聯(lián)系。這個過程要求人們付出較大的精力,而且由于它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的“編程方法”學科。
為機器建模的另一個方法是為要解決的問題制作模型。對一些早期語言來說,如LISP和APL,它們的做法是“從不同的角度觀察世界”、“所有問題都歸納為列表”或“所有問題都歸納為算法”。PROLOG 則將所有問題都歸納為決策鏈。對于這些語言,可以認為它們一部分是面向基于“強制”的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的范圍,就會顯得非常笨拙。
面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具來表達問題空間內(nèi)的元素。由于這種表達非常普遍,所以不必受限于特定類型的問題。人們將問題空間中的元素以及它們在方案空間的表示物稱作“對象”。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與以前的方法相比,這無疑是一種更加靈活、更加強大的語言抽象方法。
總之,OOP 允許人們根據(jù)問題,而不是根據(jù)方案來描述問題。然而,仍有一個聯(lián)系途徑回到計算機。每個對象都類似一臺小計算機;它們有自己的狀態(tài),而且可要求它們進行特定的操作。與現(xiàn)實世界的“對象”或者“物體”相比,編程“對象”與它們也存在共通的地方:它們都有自己的特征和行為。
2.封裝
封裝是面向對象編程的特征之一,也是類和對象的主要特征。封裝將數(shù)據(jù)以及加在這些數(shù)據(jù)上的操作組織在一起,成為有獨立意義的構件。外部無法直接訪問這些封裝了的數(shù)據(jù),從而保證了這些數(shù)據(jù)的正確性。如果這些數(shù)據(jù)發(fā)生了差錯,也很容易定位錯誤是由哪個操作引起的。
如果外部需要訪問類里面的數(shù)據(jù),就必須通過接口(Interface)進行訪問。接口規(guī)定了可對一個特定的對象發(fā)出哪些請求。當然,必須在某個地方存在著一些代碼,以便滿足這些請求。這些代碼與那些隱藏起來的數(shù)據(jù)叫做“隱藏的實現(xiàn)”。站在過程化程序編寫(Procedural Programming)的角度,整個問題并不顯得復雜。一種類型含有與每種可能的請求關聯(lián)起來的函數(shù)。一旦向對象發(fā)出一個特定的請求,就會調用那個函數(shù)。通常將這個過程總結為向對象“發(fā)送一條消息”(提出一個請求)。對象的職責就是決定如何對這條消息作出反應(執(zhí)行相應的代碼)。
若任何人都能使用一個類的所有成員,那么可對這個類做任何事情,則沒有辦法強制他們遵守任何約束——所有東西都會暴露無遺。有兩方面的原因促使了類的編制者控制對成員的訪問。第一個原因是防止程序員接觸他們不該接觸的東西——通常是內(nèi)部數(shù)據(jù)類型的設計思想。若只是為了解決特定的問題,用戶只需操作接口即可,無需明白這些信息。類向用戶提供的實際是一種服務,因為他們很容易就可看出哪些對自己非常重要,以及哪些可忽略不計。進行訪問控制的第二個原因是允許庫設計人員修改內(nèi)部結構,不用擔心它會對客戶程序員造成什么影響。例如,編制
者最開始可能設計了一個形式簡單的類,以便簡化開發(fā)。后來又決定進行改寫,使其更快地運行。若接口與實現(xiàn)方法早已隔離開,并分別受到保護,就可放心做到這一點,只要求用戶重新鏈接一下即可。封裝考慮的是內(nèi)部實現(xiàn),抽象考慮的是外部行為。符合模塊化的原則,使得軟件的可維護性、擴充性大為改觀。
3.繼承
繼承是一種聯(lián)結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類的繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且派生類可以修改或增加新的方法使之更適合特殊的需求。這也體現(xiàn)了大自然中一般與特殊的關系。繼承性很好地解決了軟件的可重用性問題。比如說,所有的Windows 應用程序都有一個窗口,它們可以看作都是從一個窗口類派生出來的。但是有的應用程序用于文字處理,有的應用程序用于繪圖,這是由于派生出了不同的子類,各個子類添加了不同的特性。關于繼承的詳細討論,將在本書4.1~4.2 節(jié)進行。
4.多態(tài)
多態(tài)也叫多態(tài)性,是指允許不同類的對象對同一消息作出響應。比如同樣的加法,把兩個時間加在一起和把兩個整數(shù)加在一起肯定完全不同。又比如,同樣的選擇“編輯”和“粘貼”操作,在字處理程序和繪圖程序中有不同的效果。多態(tài)性包括參數(shù)化多態(tài)性和運行時多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享和代碼共享的優(yōu)勢,很好地解決了應用程序函數(shù)同名問題。關于多態(tài)性的討論,將在4.4 節(jié)進行。最后,以Alan Kay 的話作為本節(jié)的結束語。他總結了Smalltalk(這是第一種成功的面向對象程序設計語言,也是Java 的基礎語言)的5 大基本特征。通過這些特征,讀者可以理解“純粹”的面向對象程序設計方法。
。1)所有東西都是對象。可將對象想象成一種新型變量,它保存著數(shù)據(jù),但可要求它對自身進行操作。理論上講,可從要解決的問題上,提出所有概念性的組件,然后在程序中將其表達為一個對象。
(2)程序是一大堆對象的組合。通過消息傳遞,各對象知道自己該做些什么。為了向對象發(fā)出請求,需向那個對象“發(fā)送一條消息”。更具體地講,可將消息想象為一個調用請求,它調用的是從屬于目標對象的一個子例程或函數(shù)。
(3)每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現(xiàn)有對象,可制作出新型對象。所以,盡管對象的概念非常簡單,但在程序中卻可達到任意高的復雜程度。
。4)每個對象都有一種類型。根據(jù)語法,每個對象都是某個“類(Class)”的一個“實例”。其中,“類”是“類型(Type)”的同義詞。一個類最重要的特征就是“能將什么消息發(fā)給它?”。
。5)同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,讀者不久便能理解。例如,由于類型為“圓(Circle)”的一個對象也屬于類型為“形狀(Shape)”的一個對象,所以一個“圓”完全能接收“形狀”的消息。這意味著可讓程序代碼統(tǒng)一指揮“形狀”,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱為對象的“可替換性”,是OOP 最重要的概念之一。
……