瘋狂Java講義
目錄
瘋狂Java講義
疯狂Java讲义
  作 者: 李剛 編著
  出 版 社: 電子工業出版社
  出版時間: 2008-9-1
  頁 數: 887頁
  開 本: 16開
  ISBN 9787121066467
  分類: 圖書 >> 計算機/編程 >> Java程序設計
  定價:¥99.00元(含光盤1張)
內容簡介 Introduction
疯狂Java讲义 内容简介
  從2000年至今,Java語言一直是應用最廣的開發語言,並擁有最廣泛的開發人群。如今,Java已經不再簡單地是一門語言,它更像一個完整的體係,一個係統的開發平臺。更甚至,它被延伸成一種開源精神。
  本書深入介紹了Java編程的相關方面,全書內容覆蓋了Java的基本語法結構、Java的面嚮對象特徵、Java集合框架體係、Java泛型、異常處理、Java GUI編程、JDBC數據庫編程、Java註釋、Java的IO流體係、Java多綫程編程、Java網絡通信編程和Java反射機製。共覆蓋了java.awt、java.lang、java.io和java.nio、java.sql、java.text、java.util、javax.swing包下絶大部分類和接口。
  本書並不單純從知識角度來講解Java,而是從解决問題的角度來介紹Java語言,所以本書中介紹了大量實用案例開發:五子棋遊戲、梭哈遊戲、仿QQ的遊戲大廳、MySQL企業管理器、仿EditPlus的文本編輯器、多綫程、斷點下載工具、Spring框架的IoC容器……這些案例既能讓讀者鞏固每章的知識,又可以讓讀者學以致用、激發編程自豪感,進而引爆內心的編程激情。本書光盤裏包含書中所有示例的代碼,如果讀者希望獲得課後練習的程序代碼,請自行登錄http://www.leegang.org站點下載。
  本書為所有打算深入掌握Java編程的讀者而編寫,適合各種層次的Java學習者和工作者閱讀,也適合作為大學教育、培訓機構的Java教材。但如果衹是想簡單涉獵Java,則本書過於龐大,不適合閱讀。
作者簡介 About the Author
  李剛從事8年的Java EE應用開發。
  曾任LITEON公司的J2EE技術主管,負責該公司的企業信息平臺的架構設計。
  曾任廣州電信、廣東竜泉科技等公司的技術培訓導師。
  2007年3月26日的《電腦報》專訪人物。
  現任新東方IT培訓廣州中心軟件教學總監,曾兼任廣東技術師範學院計算機科學係的兼職副教授。
  培訓的學生已在華為、立信、普信、網易、電信盈科、中企動力等公司就職。
  國內知名的高端IT技術作傢,已出版《Spring2.0寶典》、《基於J2EE的Ajax寶典》、《輕量級J2EE企業應用實戰》、《Struts 2權威指南》、《Ruby On Rails敏捷開發最佳實踐》等著作。
宣傳語 Slogan
  暢銷書《Struts 2權威指南》作者李剛又一力作,來自作者3年的Java培訓經歷,凝結了作者近3000個小時的授課經驗,總結了幾百個Java學員學習過程中的典型錯誤。
  1.案例驅動,引爆編程激情
  本書中涉及了大量Java案例,致力於將知識點融入實際項目的開發,希望讀者通過編寫這些程序找到編程的樂趣。
  2.再現李剛老師課堂氛圍
  本書的內容是筆者授課經歷的總結,知識體係取自李剛瘋狂Java實戰課程體係。力求以淺顯比喻代替乏味的講解,以瘋狂實戰代替空洞的理論。
  3.註釋詳細,輕鬆上手
  書中代碼的註釋非常詳細,幾乎每兩行代碼就有一行註釋,甚至還把一些簡單理論作為註釋穿插到代碼中,極大降低了讀者閱讀的難度。
前 言 Foreword
  Java語言贏得了前所未有的成功:從2001年到2007年,Java語言一直是世界上應用最廣泛的編程語言,因此現在有越來越多的工作者、學習者正努力進入Java領域或將要努力進入Java領域。
  為了幫助廣大工作者、學習者能真正掌握Java編程,感受到Java語言的魅力,領會到Java編程的快樂,筆者根據近3年來的Java授課經驗,精心編寫了本書。
  當筆者開始寫作本書之前,已經接觸了非常多剛剛畢業的大學生,他們告訴筆者:之所以選擇編程,僅僅是想找一份工作。筆者問他們,不喜歡編程嗎?他們回答: 編程有什麽樂趣?還不就是寫1 + 2 + 3 + … + 100=?……這樣的程序。於是筆者知道了:他們誤解了程序。於是筆者告訴他們:如果我來上C語言,至少講到可以編寫出一個簡單的遊戲外挂,如果再深入一點,可以結合操作係統理論,編寫一個操作係統的雛形——這纔叫寫程序。
  程序的作用是:解决問題——如果你的程序不能解决你自己的問題,如何期望你的程序去解决別人的問題呢?那你的程序的價值何在?所以筆者認為:最好的學習方法就是“案例驅動”——知道為什麽要用這個知識點,纔去學這個知識點,而不是盲目學習!因此本書強調編程實戰,強調以項目激發編程興趣。
  在筆者的授課過程中,幾乎所有學習好的學生都有過通宵的經歷,沒有人逼迫、要求他們,衹因為他們無法抗拒編程的誘惑——這也是筆者後來創立瘋狂Java實訓營實戰的直接緣由。其實每個能在編程領域裏小有所得的人,都曾有過通宵達旦的經歷,否則很難成為一個優秀的程序員。有人可能會覺得,通宵達旦太辛苦了——但烈日下揮汗如雨地打球苦不苦?廢寢忘食地玩遊戲的人苦不苦?他們自然樂在其中!同理,對於瘋狂的程序員而言,通宵達旦地編程、調試並不是苦,而是一種享受。如果讀者早一天經歷這種境界,那就會早一天打開編程的心竅。
  筆者不想告訴你:看完這本書你會成為高手!在編程領域裏,沒有所謂的“武林秘笈”,再好的書一定要配合大量練習,否則書裏的知識依然屬於作者,而讀者則仿佛身入寶山而一無所獲的笨漢。所以本書配合了大量高強度的練習,希望讀者強迫自己去完成這些項目。這些習題的答案可以登錄http://www.crazyit.org站點下載。
  本書將一如既往地保持筆者既有的風格:簡單。有一封讀者來信讓筆者記憶很深刻,他告訴筆者:相對有些人喜歡“深奧”的圖書相比,他更喜歡“簡單”的IT圖書,“簡單”的東西很清晰,明確,下一步該怎麽做,為什麽這樣做,一切都清清楚楚,無須任何猜測、想象——正好符合計算機哲學:0就是0,1就是1,中間沒有任何迴旋的餘地。他的來信非常符合筆者的觀點:IT圖書應該是簡單的、易懂的,學完之後可以帶來提高,能産生效益的圖書。本書正是如此,讀者閱讀本書時會感覺很淺顯,但讀完後能開發的程序又非常實用。
創作理念 Creative ideas
  上善若水——兼談我的創作理念
  上善若水,水善利萬物而不爭,處衆人之所惡,故幾於道——《老子》
  在泱泱中華浩如煙海的典籍中,我獨喜歡這句話,它仿佛一句箴言,揭示着人生最平實,卻最深奧的輪回。在蒼茫天地之間,衹有水的姿態如此絢麗多姿:在天,為雲為雯,絢麗華美;在𠔌,為川為淵,洶涌浩瀚;在地,為陵為山,晶瑩剔透。
  常常想忍不住,怎樣的人生纔可做到“若水”?
  經歷多年軟件開發後,我暫時性地離開了一綫開發崗位,開始了新東方IT培訓中心的Java講師生涯,也開始做一些技術咨詢、員工培訓等工作,成為了一個軟件開發的布道者。
  在後來的日子裏,我覺得這是一種輪回:一種從學習到學習的輪回。不同的是:多年前,學習的是我;現在,學習的是我的學生、我的客戶。因為這種輪回,有機會重新回顧我當年的苦難:心裏飽含萬千學習激情,但一個又一個的問題迎面撲過來,這種激情是否還會持久?
  現在學生告訴我:學習是一件很快樂的事情,特別是解决後問題後真的很快樂!但如果一個問題折騰2天都得不到正確答案,那就非常不快樂!
  從他們的話中,我悟到一個道理:何謂快樂?我想,快樂是經過千辛萬苦後抵達目的後的滿足感。快樂有如下等式:快樂=千辛萬苦+抵達目的。如果整個過程衹剩下千辛萬苦,沒有抵達目的,那麽所有的千辛萬苦就等於零了。如同上帝罰西緒弗推石頭,每天重複推同一塊石頭上山,那就變成了懲罰!
  有感於此,我創作的圖書目的是希望能帶給學習者快樂,如果他們正經歷着軟件開發中百轉千回的挫折,他們可以從圖書找到問題的解决方案。因此我所創作係列圖書衹有一個目的:解决問題,解决各種實際問題。整個創作過程中,堅持以解决開發問題為目的,以知識內在邏輯為主綫,以淺顯直白為方式,希望可以帶給閱讀者快樂。
  創作過程,我不願意使用那些太過專業的概念,而是先介紹各知識點的用法,以及對應的知識點語法,而各種專業概念,我寧願放在最後介紹!不得不承認,計算機領域的專業概念是如此層出不窮,又如此詞不達意!例如網絡編程中的Socket,不知道哪位“天才”將其翻譯成“套接字”,這多年前曾是我的惡夢;再如時下流行的AOP編程中的Advice,有的說是建議,有的說是通知,完全是不知所云!這種名稱,對初學者該是怎樣的折磨啊!
  常常會想:這些概念的名稱很重要嗎?為什麽一定要給它們一個如此“深奧”的名稱?例如講解方法重寫時,我歸納出方法重寫的規則:兩同兩小一大,分別是父類、子類的方法名相同、參數列表相同,子類方法返回值類型相同或更小、子類方法拋出的異常相同或者更小,子類方法的訪問控製相等或者更大。當我的學生去面試時,給他的面試官介紹這條規則時,他的面試官連聲質問他:什麽叫異常更小?異常之間衹有父子關係,沒有大小關係!(實際上,從父類到子類,就是一般到特殊的關係。因此可以認為子類的範圍比父類的範圍更小,就如蘋果類的範圍比水果類的範圍更小)這是一種現狀:大部分人熱衷於那些很正規、但陳腐的說法,很少有人願意“化神奇為腐朽”。
  堅持認為:化神奇為腐朽可能需要更深厚的知識,更高的視角纔可達到這種境界。不管人類知識如何演變、如何復雜,各種知識都是具有極深的關聯、類比的,即使是某些十分晦澀的知識點,等真正明白了它的含義後,一定會發現它類似於日常生活中最平常的事情。例如介紹設計模式的圖書,大多說得非常專業、甚至有點神乎其技。但我更願意這樣介紹設計模式:當你看到一條水溝橫亙在你的面前,你應該跳過去,而不是再繼續前走!這就是設計模式。但如果一個初學者對一個所謂“高手”介紹這個定義時,一定又會被連聲質問。
  創作一本圖書時,目的很重要!因為我的目的是解决問題,帶給讀者快樂。因此我希望用最司空見慣的示例,類比最深奧的知識,希望讓讀者從最平常的知識,過渡到那些所謂的專業知識。幫助讀者找到晦澀知識和日常知識之間類比,從而讓讀者産生“所謂某某某知識,原來不過如此”的感覺!
  很多所謂的“高手”,積纍了一定的知識,但遠遠沒有達到“悟”的境界,大部分時候衹會人云亦云,卻往往以為自己掌握的纔是最正確的真理!這是學術界永恆的悲哀,一如布魯諾被燒死在羅馬鮮花廣場上一樣悲哀!而國內的開發界更多浮躁,我所面試的老師大都是某公司技術經理、項目經理,甚至包括某大型IT培訓結構跳槽的老師,但當要求他們寫一個簡單的網絡通信程序時,他們卻往往理由很多:沒有文檔、沒有IDE工具、不能上網查資料、準備不充分……他們的理由比他們的知識多!可能這是中國大部分程序員的現狀:他們都是“高手”,動輒精通“Java、C++”,但一旦要求當場完成一個小程序則睏難重重!實際上,很多學生經跟我學習一個月後,就可以完成一個模擬QQ在綫遊戲大廳的應用,再晚一點,可以開發出MySQL企業管理器(功能與MySQL Front相同)。但我卻一直告誡他們:你們還很差,還需要更多積纍!
  改變這種浮囂!是我創作圖書另一個目的。整個創作過程中,一直堅持“代碼就是硬道理”的準則,堅持把所有的知識點以小應用的方式演示出來。因為:程序是寫出來,而不是說出來的。讀者可以從我所創作的係列圖書中,每本都可以看到豐富的代碼範例。
  創作一本圖書是很辛苦的事情,甚至有些得不償失。曾有人告訴我,如果你想通過寫書來賺錢,你應該寫“如何上網”、“如何使用Windows”之類的題材,因為受衆面廣!但他不明白:我不曾想過通過創作圖書來賺錢。我作為新東方IT培訓廣州中心教學總監,新招聘的老師都可領近一萬的月薪。因此,我從未想過通過創作圖書來賺錢。包括下一步計劃創作的WorkFlow以及Shark,受衆面更窄!但我依然會寫,而且會很認真地寫!
  正如我寫介紹Struts2的圖書一樣,我希望第一本介紹Stuts2的圖書是用中文寫成的!同樣,在多年的企業應用開發中,我覺得WorkFlow的用處是如此之大,有必要讓國內的軟件開發者瞭解它,使用它,所以我要介紹它。
  國內還有一個很奇怪的對比:網絡上有很多“憤青”,他們很愛國,他們自信得有些自大,他們無所畏懼,每天在網絡上以口水徵服世界。與之相反的是,很多軟件開發領域的人則無比自卑,他們認為國外的軟件人才一定比國內的好,國外的圖書一定比國內的好!當我所出版的《基於J2EE的Ajax寶典》面世後,有人在網絡上評論:寫得這麽全面,肯定是從哪裏抄襲的!有時候,我們寧遠記住國外人的話,但不願記住我們自己說的話。例如,軟件開發領域衆所周知的DRY法則,其實很多年前我就說過:如果你在一個係統裏兩次以上重複了相同代碼,這個係統的設計是可以改進的。
  不可否認,國外的IT技術比國內IT技術的整體水平要高,但並不是國外的所有軟件開發者就比國內所有的軟件開發者優秀!在浮囂的背景下,國內依然有一些埋頭沉湎於代碼的軟件人,他們默默地支撐着中國的軟件業,他們纔是真正的程序員。而我,作為一個曾經沉湎於代碼的程序員,希望能把這種務實的精神傳播出去,用我圖書,用書中的代碼,把這種務實的精神傳播開來。個人以為,這也是一種愛國,而且是我喜歡的愛國方式:切實愛國!
  上善若水,水善利萬物!無從知道我是否善於利萬物,但我正希望自己能利萬物,希望自己創作的圖書能為中國的軟件業作出微薄的貢獻。如果我的圖書為真正的程序員解决了問題,帶給了程序員快樂,那就是我最大的快樂。
目錄
  第1章 Java概述 1
  1.1 Java語言的發展簡史 2
  1.2 Java的競爭對手及各自優勢 4
  1.2.1 C#簡介和優勢 4
  1.2.2 Ruby簡介和優勢 4
  1.2.3 Python的簡介和優勢 5
  1.3 Java程序運行機製 5
  1.3.1 高級語言的運行機製 6
  1.3.2 Java程序的運行機製和JVM 6
  1.4 開發Java的準備 7
  1.4.1 安裝JDK 8
  學生提問:不是說JVM是運行Java程序的虛擬機嗎?那JRE和JVM的關係是怎樣的呢? 8
  學生提問:為什麽不安裝公共JRE係統呢? 9
  1.4.2 設置PATH環境變量 10
  學生提問:為什麽選擇設置用戶變量,用戶變量和係統變量有什麽區別呢? 11
  1.5 第一個Java程序 12
  1.5.1 編輯Java源代碼 12
  1.5.2 編譯Java程序 13
  學生提問:當我們使用編譯C程序時,不僅需要指定存放目標文件的位置,也需要指定目標文件的文件名,這裏使用javac編譯Java程序時怎麽不需要指定目標文件的文件名呢? 13
  1.5.3 運行Java程序 14
  1.5.4 根據CLASSPATH環境變量定位類 15
  1.6 Java程序的基本規則 16
  1.6.1 Java程序的組織形式 16
  1.6.2 Java源文件的命名規則 17
  1.6.3 初學者容易犯的錯誤 18
  1.7 垃圾回收機製 20
  1.8 何時開始使用IDE工具 21
  學生提問:老師,我想學習Java編程,到底是學習Eclipse好呢,還是學習JBuilder好呢? 21
  1.9 本章小結 22
  本章練習 22
  第2章 理解面嚮對象 23
  2.1 面嚮對象 24
  2.1.1 結構化程序設計簡介 24
  2.1.2 程序的三種基本結構 25
  2.1.3 面嚮對象程序設計簡介 27
  2.1.4 面嚮對象的基本特徵 28
  2.2 UML(統一建模語言)介紹 29
  2.2.1 用例圖 30
  2.2.2 類圖 31
  2.2.3 組件圖 33
  2.2.4 部署圖 33
  2.2.5 順序圖 34
  2.2.6 活動圖 34
  2.2.7 狀態機圖 36
  2.3 Java的面嚮對象特徵 36
  2.3.1 一切都是對象 37
  2.3.2 類和對象 37
  2.4 本章小結 37
  第3章 數據類型和運算符 38
  3.1 註釋 39
  3.1.1 單行註釋和多行註釋 39
  3.1.2 文檔註釋 40
  學生提問:API文檔是什麽? 40
  學生提問:為什麽要掌握查看API文檔的方法? 42
  3.2 標識符和關鍵字 45
  3.2.1 分隔符 45
  3.2.2 標識符規則 47
  3.2.3 Java關鍵字 47
  3.3 數據類型分類 48
  3.4 基本數據類型 48
  3.4.1 整型 49
  3.4.2 字符型 49
  3.4.3 浮點型 51
  3.4.4 布爾型 52
  3.5 基本類型的類型轉換 53
  3.5.1 自動類型轉換 53
  3.5.2 強製類型轉化 54
  3.5.3 表達式類型的自動提升 56
  3.6 直接量 57
  3.6.1 直接量的類型 57
  3.6.2 直接量的賦值 58
  3.7 運算符 58
  3.7.1 算術運算符 58
  3.7.2 賦值運算符 61
  3.7.3 位運算符 62
  3.7.4 擴展後的賦值運算符 64
  3.7.5 比較運算符 65
  學生提問:Java為什麽要對這些數據進行緩存呢? 67
  3.7.6 邏輯運算符 67
  3.7.7 三目運算符 68
  3.7.8 運算符的結合性和優先級 69
  3.8 本章小結 70
  本章練習 70
  第4章 流程控製和數組 71
  4.1 順序結構 72
  4.2 分支結構 72
  4.2.1 if條件語句 72
  4.2.2 switch分支語句 76
  4.3 循環結構 78
  4.3.1 while循環語句 78
  4.3.2 do while循環語句 79
  4.3.3 for循環 80
  4.3.4 嵌套循環 83
  4.4 控製循環結構 84
  4.4.1 使用break結束循環 84
  4.4.2 使用continue結束本次循環 86
  4.4.3 使用return結束方法 87
  4.5 數組類型 87
  4.5.1 理解數組:數組也是一種類型 88
  學生提問:int[]是一種類型嗎?怎麽使用這種類型呢? 88
  4.5.2 定義數組 88
  4.5.3 數組的初始化 89
  學生提問:能不能衹分配內存空間,不賦初始值呢?89
  4.5.4 使用數組 90
  學生提問:為什麽要我記住這些異常信息? 91
  4.5.5 JDK1.5提供了foreach循環 91
  4.6 深入數組 93
  4.6.1 內存中的數組 93
  學生提問:為什麽有棧內存和堆內存之分? 93
  4.6.2 基本類型數組的初始化 95
  4.6.3 引用類型數組的初始化 96
  4.6.4 沒有多維數組 99
  學生提問:我是否可以讓圖4.13中灰色覆蓋的數組元素再次指嚮另一個數組?這樣不可以擴展成三維數組嗎?甚至擴展到更多維的數組? 101
  4.6.5 操作數組的工具類 102
  4.6.6 數組的應用舉例 103
  4.7 本章小結 106
  本章練習 106
  第5章 面嚮對象(上) 107
  5.1 類和對象 108
  5.1.1 定義類 108
  學生提問:構造器不是沒有返回值嗎?為什麽不能用void修飾呢? 110
  5.1.2 對象的産生和使用 110
  5.1.3 對象、引用和指針 111
  5.1.4 對象的this引用 112
  5.2 方法詳解 116
  5.2.1 方法的所屬性 116
  5.2.2 方法的參數傳遞機製 116
  5.2.3 形參長度可變的方法 120
  5.2.4 遞歸方法 121
  5.2.5 方法重載 123
  學生提問:為什麽方法的返回值類型不能用於區分重載的方法? 124
  5.3 成員變量和局部變量 124
  5.3.1 成員變量和局部變量 125
  5.3.2 成員變量的初始化和內存中的運行機製 128
  5.3.3 局部變量的初始化和內存中的運行機製 130
  5.3.4 變量的使用規則 130
  5.4 隱藏和封裝 132
  5.4.1 理解封裝 132
  5.4.2 使用訪問控製符 132
  5.4.3 package和import 135
  5.4.4 Java的常用包 140
  5.5 深入構造器 140
  5.5.1 使用構造器執行初始化 141
  學生提問:構造器是創建Java對象的途徑,是不是說構造器完全負責創建Java對象? 141
  5.5.2 構造器的重載 142
  學生提問:為什麽要用this來調用另一個重載的構造器?我把另一個構造器裏的代碼復製、粘貼到這個構造器裏不就可以了嗎? 143
  5.6 類的繼承 144
  5.6.1 繼承的特點 144
  5.6.2 重寫父類的方法 145
  5.6.3 父類實例的super引用 146
  學生提問:我們衹是創建了一個Ostrich對象時,哪來的Bird對象? 147
  5.6.4 調用父類構造器 148
  學生提問:為什麽我創建Java對象時從未感覺到java.lang.Object的構造器被調用過? 150
  5.7 多態 151
  5.7.1 多態性 151
  5.7.2 引用變量的強製類型轉換 152
  5.7.3 instanceof運算符 154
  5.8 繼承與組合 154
  5.8.1 使用繼承的註意點 155
  5.8.2 利用組合實現復用 156
  學生提問:使用組合關係來實現復用時,需要創建兩個Animal對象,是不是意味着使用組合關係時係統開銷更大? 159
  5.9 初始化塊 159
  5.9.1 使用初始化塊 160
  5.9.2 初始化塊和構造器 161
  5.9.3 靜態初始化塊 162
  5.10 本章小結 165
  本章練習 165
  第6章 面嚮對象(下) 166
  6.1 基本數據類型的包裝類 167
  6.2 處理對象 170
  6.2.1 打印對象和toString方法 170
  6.2.2 ==和equals比較運算符 172
  6.3 類成員 175
  6.3.1 理解類成員 175
  6.3.2 單例(Singleton)類 176
  6.4 final修飾符 177
  6.4.1 final變量 177
  6.4.2 final方法 181
  6.4.3 final類 182
  6.4.4 不可變類 182
  6.4.5 緩存實例的不可變類 186
  6.5 抽象類 188
  6.5.1 抽象方法和抽象類 188
  6.5.2 抽象類的作用 191
  6.6 更徹底的抽象:接口 192
  6.6.1 接口的概念 192
  6.6.2 接口的定義 193
  6.6.3 接口的繼承 195
  6.6.4 使用接口 195
  6.6.5 接口和抽象類 197
  6.6.6 面嚮接口編程 198
  6.7 內部類 202
  6.7.1 非靜態內部類 202
  學生提問:非靜態內部類對象和外部類對象的關係是怎樣的? 206
  6.7.2 靜態內部類 207
  學生提問:為什麽靜態內部類實例方法也不能訪問外部類的實例屬性呢? 207
  學生提問:接口裏是否能定義內部接口? 208
  6.7.3 使用內部類 208
  學生提問:既然內部類是外部類的成員,是否可以為外部類定義子類,在子類中再定義一個內部類來重寫其父類中的內部類? 211
  6.7.4 局部內部類 211
  6.7.5 匿名內部類 212
  6.7.6 閉包(Closure)和回調 215
  6.8 枚舉類 217
  6.8.1 手動實現枚舉類 217
  6.8.2 枚舉類入門 219
  6.8.3 枚舉類的屬性、方法和構造器 220
  6.8.4 實現接口的枚舉類 223
  6.8.5 包含抽象方法的枚舉類 224
  6.9 對象與垃圾回收 225
  6.9.1 對象在內存中的狀態 226
  6.9.2 強製垃圾回收 227
  6.9.3 finalize方法 228
  6.9.4 對象的軟、弱和虛引用 230
  6.10 修飾符的適用範圍 233
  6.11 使用JAR文件 234
  6.11.1 jar命令詳解 235
  6.11.2 創建可執行的JAR包 237
  6.11.3 關於JAR包的技巧 238
  6.12 本章小結 239
  本章練習 239
  第7章 Java集合 240
  7.1 Java集合概述 241
  7.2 Collection和Iterator接口 243
  7.2.1 使用Iterator接口遍歷集合元素 244
  7.2.2 使用foreach循環遍歷集合元素 246
  7.3 Set接口 247
  7.3.1 HashSet類 247
  學生提問:hashCode方法對於HashSet的作用是什麽? 249
  7.3.2 TreeSet類 252
  7.3.3 EnumSet類 259
  7.4 List接口 261
  7.4.1 List接口和ListIterator接口 261
  7.4.2 ArrayList和Vector實現類 264
  7.4.3 固定長度的List 266
  7.5 Queue接口 266
  7.5.1 LinkedList實現類 266
  7.5.2 PriorityQueue實現類 269
  7.6 Map 270
  7.6.1 HashMap和Hashtable實現類 271
  7.6.2 SortedMap接口和TreeMap實現類 276
  7.6.3 WeakHashMap實現類 279
  7.6.4 IdentityHashMap實現類 280
  7.6.5 EnumMap實現類 281
  7.7 HashSet和HashMap的性能選項 282
  7.8 操作集合的工具類:Collections 283
  7.8.1 排序操作 283
  7.8.2 查找,替換操作 287
  7.8.3 同步控製 288
  7.8.4 設置不可變集合 288
  7.9 煩瑣的接口:Enumeration 289
  7.10 本章小結 290
  本章練習 290
  第8章 泛型 291
  8.1 泛型入門 292
  8.1.1 編譯時不檢查類型的異常 292
  8.1.2 手動實現編譯時檢查類型 293
  8.1.3 使用泛型 294
  8.2 深入泛型 294
  8.2.1 定義泛型接口、類 295
  8.2.2 從泛型類派生子類 296
  8.2.3 並不存在泛型類 298
  8.3 類型通配符 298
  8.3.1 使用類型通配符 300
  8.3.2 設定類型通配符的上限 300
  8.3.3 設定類型形參的上限 302
  8.4 泛型方法 303
  8.4.1 定義泛型方法 303
  8.4.2 泛型方法和類型通配符的區別 306
  8.4.3 設定通配符的下限 307
  8.4.4 泛型方法與方法重載 309
  8.5 擦除和轉換 310
  8.6 泛型與數組 311
  8.7 本章小結 313
  第9章 與運行環境交互 314
  9.1 與用戶互動 315
  9.1.1 運行Java程序的參數 315
  9.1.2 使用Scanner獲取鍵盤輸入 316
  9.1.3 使用BufferedReader獲取鍵盤輸入 318
  9.2 係統相關 319
  9.2.1 System類 319
  9.2.2 Runtime類 321
  9.3 常用類 322
  9.3.1 Object類 322
  9.3.2 String、StringBuffer和StringBuilder類 322
  9.3.3 Math類 327
  9.3.4 Random類 328
  9.3.5 BigDecimal類 330
  9.4 處理日期的類 333
  9.4.1 Date類 333
  9.4.2 Calendar類 334
  9.4.3 TimeZone類 337
  9.5 正則表達式 338
  9.5.1 創建正則表達式 338
  9.5.2 使用正則表達式 341
  9.6 程序國際化 345
  9.6.1 Java國際化的思路 346
  9.6.2 Java支持的語言和國傢 346
  9.6.3 完成程序國際化 347
  9.6.4 使用MessageFormat處理包含占位符的字符串 349
  9.6.5 使用類文件代替資源文件 350
  9.6.6 使用NumberFormat格式化數字 350
  9.6.7 使用DateFormat格式化日期 352
  9.7 本章小結 355
  本章練習 355
  第10章 異常處理 356
  10.1 異常概述 357
  10.2 異常處理機製 358
  10.2.1 使用try...catch捕獲異常 359
  10.2.2 異常類的繼承體係 360
  10.2.3 訪問異常信息 363
  10.2.4 使用finally回收資源 364
  10.2.5 異常處理的嵌套 367
  10.3 Checked異常和Runtime異常體係 367
  10.3.1 使用throws聲明拋出異常 367
  10.4 使用throw拋出異常 369
  10.4.1 拋出異常 369
  10.4.2 自定義異常類 371
  10.4.3 catch和throw同時使用 371
  10.4.4 異常鏈 373
  10.5 Java的異常跟蹤棧 374
  10.6 異常處理規則 376
  10.6.1 不要過度使用異常 377
  10.6.2 不要使用過於龐大的try塊 378
  10.6.3 避免使用Catch All語句 378
  10.6.4 不要忽略捕獲到的異常 379
  10.7 本章小結 379
  本章練習 379
  第11章 AWT編程 380
  11.1 GUI(圖形用戶界面)和AWT 381
  11.2 AWT容器 382
  11.3 佈局管理器 385
  11.3.1 FlowLayout佈局管理器 386
  11.3.2 BorderLayout佈局管理器 387
  學生提問:BorderLayout最多衹能放置5個組件嗎?那它還有什麽作用? 388
  11.3.3 GridLayout佈局管理器 389
  11.3.4 GridBagLayout佈局管理器 390
  11.3.5 CardLayout佈局管理器 393
  11.3.6 絶對定位 395
  11.3.7 BoxLayout佈局管理器 396
  學生提問:圖11.15和圖11.16顯示的所有按鈕都緊挨在一起,如果希望像FlowLayout、GridLayout等佈局管理器指定組件的間距該怎麽辦? 397
  11.4 AWT 常用組件 398
  11.4.1 基本組件 398
  11.4.2 對話框 400
  11.5 事件處理 403
  11.5.1 Java事件模型的流程 403
  11.5.2 事件和事件監聽器 405
  11.5.3 事件適配器 409
  11.5.4 事件監聽器的實現形式 411
  11.6 AWT的菜單 413
  11.6.1 菜單條、菜單和菜單項 414
  11.6.2 右鍵菜單 416
  學生提問:為什麽即使我沒有給多行文本域編寫右鍵菜單,但當我在多行文本域上單擊右鍵時一樣會彈出右鍵菜單? 418
  11.7 在AWT中繪圖 418
  11.7.1 畫圖的實現原理 418
  11.7.2 使用Graphics類 419
  11.8 處理位圖 425
  11.8.1 Image抽象類和BufferedImage實現類 425
  11.8.2 使用ImageIO輸入/輸出位圖 427
  11.9 剪貼板 432
  11.9.1 數據傳遞的類和接口 432
  11.9.2 傳遞文本 433
  11.9.3 使用係統剪貼板傳遞圖像 435
  11.9.4 使用本地剪貼板來傳遞對象引用 439
  11.9.5 通過係統剪貼板傳遞Java對象 442
  11.10 本章小結 445
  本章練習 445
  第12章 Swing編程 446
  12.1 Swing概述 447
  12.2 Swing基本組件的用法 448
  12.2.1 Swing組件層次 448
  12.2.2 AWT組件的Swing實現 449
  學生提問:為什麽單擊Swing多行文本域時不是彈出像AWT多行文本域中的右鍵菜單? 455
  12.2.3 使用JToolBar創建工具條 458
  12.2.4 使用JColorChooser和JFileChooser 461
  12.2.5 使用JOptionPane 469
  12.3 Swing中的特殊容器 475
  12.3.1 使用JSplitPane 475
  12.3.2 使用JTabbedPane 477
  12.3.3 使用JLayeredPane、JDesktopPane和JInternalFrame 481
  12.4 Swing拖放功能 490
  12.4.1 拖放目標 491
  12.4.2 拖放源 494
  12.4.3 簡化的拖放操作 495
  12.5 Applet和JApplet 497
  12.5.1 Applet簡介及其安全性 498
  12.5.2 開發Applet類 498
  12.5.3 使用HTML頁面裝載Applet 500
  12.5.4 appletviewer簡介 502
  12.5.5 Applet的生命周期和動畫機製 503
  學生提問:程序中重寫paint方法時繪製了一個字符串,但圖12.28上則繪製出了如此之多的字符串,這是為什麽呢? 505
  12.5.6 使用Applet創建音樂播放器 505
  12.6 使用JProgressBar、ProgressMonitor和BoundedRangeModel創建進度條 508
  12.6.1 創建進度條 508
  12.6.2 創建進度對話框 512
  12.7 使用JSlider和BoundedRangeModel創建滑動條 513
  12.8 使用JSpinner和SpinnerModel創建微調控製器 517
  12.9 使用JList、JComboBox創建列表框 520
  12.9.1 簡單列表框 520
  12.9.2 不強製存儲列表項的ListModel和ComboBoxModel 524
  12.9.3 強製存儲列表項的DefaultListModel和DefaultComboBoxModel 528
  學生提問:為什麽JComboBox提供了添加、刪除列表項目的方法?而JList沒有提供添加、刪除列表項的方法呢? 530
  12.9.4 使用ListCellRenderer改變列表項外觀 530
  12.10 使用JTree和TreeModel創建樹 532
  12.10.1 創建樹 533
  12.10.2 拖動、編輯樹節點 536
  12.10.3 監聽節點事件 540
  12.10.4 使用TreeCellRendering改變節點外觀 542
  12.11 使用JTable和TableModel創建表格 549
  12.11.1 創建JTable 549
  學生提問:我們指定的表格數據、表格列標題都是Object類型的數組,JTable如何顯示這些Object對象?550
  12.11.2 TableModel和監聽器 555
  12.11.3 TableColumnModel和監聽器 561
  12.11.4 實現排序 564
  12.11.5 繪製單元格內容 567
  12.11.6 編輯單元格內容 570
  12.12 使用JFormattedTextField和JTextPane創建格式文本 576
  12.12.1 監聽Document的改變 576
  12.12.2 使用JPasswordField 578
  12.12.3 使用JFormattedTextField 579
  12.12.4 使用JEditorPane 588
  12.12.5 使用JTextPane 588
  12.13 本章小結 595
  本章練習 595
  第13章 JDBC編程 596
  13.1 JDBC基礎 597
  13.1.1 JDBC簡介 597
  13.1.2 JDBC驅動程序類型 598
  13.2 SQL語法介紹 599
  13.2.1 安裝數據庫 599
  13.2.2 關係數據庫基本概念和MySQL基本命令 601
  13.2.3 SQL語句基礎 603
  13.2.4 DDL語句 604
  13.2.5 DML語句語法 618
  13.2.6 select語句和SQL函數 620
  13.2.7 分組和組函數 627
  13.2.8 多表連接查詢和子查詢 629
  13.3 JDBC的典型用法 635
  13.3.1 JDBC常用接口和類簡介 635
  13.3.2 JDBC編程步驟 637
  學生提問:前面給出的僅是MySQL和Oracle兩種數據庫的驅動,我看不出驅動類字符串有什麽規律啊。如果我希望使用其他數據庫,我怎麽用其他數據庫的驅動類呢?637
  13.4 執行SQL語句的方式 639
  13.4.1 使用executeUpdate執行DDL和DML語句 640
  13.4.2 使用execute方法執行SQL語句 642
  13.4.3 使用PreparedStatement執行SQL語句 644
  13.4.4 使用CallableStatement調用存儲過程 650
  13.5 管理結果集 652
  13.5.1 可滾動、可更新的結果集 652
  13.5.2 處理Blob類型數據 654
  13.5.3 使用ResultSetMetaData分析結果集 660
  13.6 事務處理 663
  13.6.1 事務的概念和MySQL事務支持 663
  13.6.2 JDBC的事務支持 665
  13.6.3 批量更新 667
  13.7 分析數據庫信息 668
  13.7.1 使用DatabaseMetaData分析數據庫信息 668
  13.7.2 使用係統表分析數據庫信息 670
  13.7.3 選擇合適的分析方式 671
  13.8 使用連接池管理連接 671
  13.9 本章小結 673
  本章練習 673
  第14章 Annotation(註釋) 674
  14.1 基本Annotation 675
  14.1.1 限定重寫父類方法:@Override 675
  14.1.2 標示已過時:@Deprecated 676
  14.1.3 抑製編譯器警告:@SuppressWarnings 677
  14.2 自定義Annotation 677
  14.2.1 定義Annotation 677
  14.2.2 提取Annotation的信息 679
  14.2.3 使用Annotation的例子 680
  14.3 JDK的元Annotation 685
  14.3.1 使用@Retention 685
  14.3.2 使用@Target 686
  14.3.3 使用@Documented 686
  14.3.4 使用@Inherited 687
  14.4 使用APT處理Annotation 688
  14.5 本章小結 693
  第15章 輸入/輸出 694
  15.1 File類 695
  15.1.1 訪問文件和目錄 695
  15.1.2 文件過濾器 697
  15.2 理解Java的IO流 698
  15.2.1 流的分類 698
  15.2.2 流的概念模型 699
  15.3 字節流和字符流 700
  15.3.1 InputStream和Reader 701
  15.3.2 OutputStream和Writer 703
  15.4 輸入/輸出流體係 705
  15.4.1 處理流的用法 705
  15.4.2 輸入/輸出流體係 706
  15.4.3 轉換流 708
  學生提問:怎麽沒有把字符流轉換成字節流的轉換流呢? 708
  15.4.4 推回輸入流 710
  15.5 重定嚮標準輸入/輸出 711
  15.6 Java虛擬機讀寫其他進程的數據 713
  15.7 RandomAccessFile 716
  15.8 對象序列化 720
  15.8.1 序列化的含義和意義 720
  15.8.2 使用對象流實現序列化 720
  15.8.3 對象引用的序列化 723
  15.8.4 自定義序列化 728
  15.8.5 另一種自定義序列化機製 733
  15.8.6 版本 735
  15.9 Java新IO 736
  15.9.1 Java新IO概述 736
  15.9.2 使用Buffer 737
  15.9.3 使用Channel 740
  15.9.4 編碼集和Charset 743
  15.9.5 文件鎖 745
  15.10 本章小結 747
  本章練習 747
  第16章 多綫程 748
  16.1 綫程概述 749
  16.1.1 綫程和進程 749
  16.1.2 多綫程的優勢 750
  16.2 綫程的創建和啓動 750
  16.2.1 繼承Thread類創建綫程類 751
  16.2.2 實現Runnable接口創建綫程類 752
  16.2.3 兩種方式所創建綫程的對比 754
  16.3 綫程的生命周期 754
  16.3.1 新建和就緒狀態 754
  16.3.2 運行和阻塞狀態 756
  16.3.3 綫程死亡 757
  16.4 控製綫程 758
  16.4.1 join綫程 758
  16.4.2 後臺綫程 759
  16.4.3 綫程睡眠:sleep 760
  16.4.4 綫程讓步:yield 761
  16.4.5 改變綫程優先級 762
  16.5 綫程的同步 764
  16.5.1 綫程安全問題 764
  16.5.2 同步代碼塊 766
  16.5.3 同步方法 767
  16.5.4 釋放同步監視器的鎖定 770
  16.5.5 同步鎖(Lock) 770
  16.5.6 死鎖 772
  16.6 綫程通信 774
  16.6.1 綫程的協調運行 774
  16.6.2 使用條件變量控製協調 778
  16.6.3 使用管道流 780
  16.7 綫程組和未處理的異常 782
  16.8 Callable和Future 785
  16.9 綫程池 787
  16.10 綫程相關類 789
  16.10.1 ThreadLocal類 789
  16.10.2 包裝綫程不安全的集合 791
  16.10.3 綫程安全的集合類 792
  16.11 本章小結 792
  第17章 網絡編程 793
  17.1 網絡編程的基礎知識 794
  17.1.1 網絡基礎知識 794
  17.1.2 IP地址和端口號 795
  17.2 Java的基本網絡支持 796
  17.2.1 使用InetAddress 796
  17.2.2 使用URLDecoder和URLEncoder 797
  17.2.3 使用URL和URLConnection 798
  17.3 基於TCP協議的網絡編程 806
  17.3.1 TCP協議基礎 806
  17.3.2 使用ServletSocket創建TCP服務器端 807
  17.3.3 使用Socket進行通信 807
  17.3.4 加入多綫程 810
  17.3.5 記錄用戶信息 813
  17.3.6 使用NIO實現非阻塞Socket通信 823
  17.4 基於UDP協議的網絡編程 829
  17.4.1 UDP協議基礎 829
  17.4.2 使用DatagramSocket發送、接收數據 829
  17.4.3 使用MulticastSocket實現多點廣播 834
  17.5 使用代理服務器 845
  17.5.1 直接使用Proxy創建連接 845
  17.5.2 使用ProxySelector選擇代理服務器 847
  17.6 本章小結 849
  本章練習 849
  第18章 類加載和反射 850
  18.1 類的加載、連接和初始化 851
  18.1.1 JVM和類 851
  18.1.2 類的加載 852
  18.1.3 類的連接 853
  18.1.4 類的初始化 853
  18.1.5 類初始化的時機 854
  18.2 類加載器 855
  18.2.1 類加載器簡介 856
  18.2.2 類加載機製 857
  18.2.3 創建並使用自定義的類加載器 858
  18.2.4 URLClassLoader類 862
  18.3 通過反射查看類信息 863
  18.3.1 獲得Class對象 863
  18.3.2 從Class中獲取信息 864
  18.4 使用反射生成並操作對象 868
  18.4.1 創建對象 868
  18.4.2 調用方法 870
  18.4.3 訪問屬性值 873
  18.4.4 操作數組 874
  18.5 使用反射生成JDK動態代理 875
  18.5.1 使用Proxy和InvocationHandler創建動態代理 876
  18.5.2 動態代理和AOP 878
  18.6 反射和泛型 882
  18.6.1 泛型和Class類 882
  18.6.2 使用反射來獲取泛型信息 884
  18.7 本章小結 885
  本章練習 886
  上善若水——兼談我的創作理念 887