前 言
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語言贏得了前所未有的成功:從2001年到2007年,Java語言一直是世界上套用最廣泛的程式語言,因此越來越多的工作者、學習者正努力進入Java領域或將要努力進入Java領域。
為了幫助廣大工作者、學習者能真正掌握Java編程,感受到Java語言的魅力,領會到Java編程的快樂,筆者根據多年來的Java授課經驗,精心編寫了本書。
當筆者開始寫作本書之前,已經接觸了非常多剛剛畢業的大學生,他們告訴筆者:之所以選擇編程,僅僅是想找一份工作。筆者問他們,不喜歡編程嗎?他們回答: 編程有什麼樂趣?還不就是寫1 + 2 + 3 + … + 100=?……這樣的程式。於是筆者知道了:他們誤解了程式。於是筆者告訴他們:如果我來上C語言,至少講到可以編寫出一個簡單的遊戲外掛,如果再深入一點,可以結合作業系統理論,編寫一個作業系統的雛形——這才叫寫程式。
程式的作用是:解決問題——如果你的程式不能解決你自己的問題,如何期望你的程式去解決別人的問題呢?那你的程式的價值何在?所以筆者認為:最好的學習方法就是“案例驅動”——知道為什麼要用這個知識點,才去學這個知識點,而不是盲目學習!因此本書強調編程實戰,強調以項目激發編程興趣。
在筆者的授課過程中,幾乎所有學習好的學生都有過通宵的經歷,沒有人逼迫、要求他們,只因為他們無法抗拒編程的誘惑——這也是筆者後來創立瘋狂Java實訓營實戰的直接緣由。其實每個能在編程領域裡小有所得的人,都曾有過通宵達旦的經歷,否則很難成為一個優秀的程式設計師。有人可能會覺得,通宵達旦太辛苦了——但烈日下揮汗如雨地打球苦不苦?廢寢忘食地玩遊戲的人苦不苦?他們自然樂在其中!同理,對於
瘋狂的程式設計師而言,通宵達旦地編程、調試並不是苦,而是一種享受。如果讀者早一天經歷這種境界,那就會早一天打開編程的心竅。
筆者不想告訴你:看完這本書你會成為高手!在編程領域裡,沒有所謂的“武林秘笈”,再好的書一定要配合大量練習,否則書里的知識依然屬於作者,而讀者則仿佛身入寶山而一無所獲的笨漢。所以本書配合了大量高強度的練習,希望讀者強迫自己去完成這些項目。
本書將一如既往地保持筆者既有的風格:簡單。有一封讀者來信讓筆者記憶很深刻,他告訴筆者:相對有些人喜歡“深奧”的圖書相比,他更喜歡“簡單”的IT圖書,“簡單”的東西很清晰,明確,下一步該怎么做,為什麼這樣做,一切都清清楚楚,無須任何猜測、想像——正好符合計算機哲學:0就是0,1就是1,中間沒有任何迴旋的餘地。他的來信非常符合筆者的觀點:IT圖書應該是簡單的、易懂的,學完之後可以帶來提高,能產生效益的圖書。本書正是如此,讀者閱讀本書時會感覺很淺顯,但讀完後能開發的程式又非常實用。
本書特點
本書並不是一個簡單的Java入門教材,也不是一門“閉門造車”式的Java讀物。本書來自筆者6年多的Java培訓經歷,凝聚了筆者將近6000小時的授課經驗,總結了上千個Java學員學習過程中的典型錯誤。
本書有三個特點:
1、案例驅動,引爆編程激情
本書不在是知識點的鋪陳,而是致力於將知識點融入實際項目開發中,所以本書涉及了大量Java案例:仿QQ遊戲大廳、MySQL企業管理器、多執行緒、斷點下載工具…希望讀者通過編寫這些程式找到編程的樂趣。
瘋狂Java講義
第一版
作 者:李剛編著
頁 數: 887頁
開 本: 16開
ISBN 9787121066467
分類:
定價:¥99.00元(含光碟1張)
內容簡介
本書並不單純從知識角度來講解Java,而是從解決問題的角度來介紹Java語言,所以本書中介紹了大量實用案例開發:五子棋遊戲、梭哈遊戲、仿QQ的遊戲大廳、MySQL企業管理器、仿EditPlus的文本編輯器、多執行緒、斷點下載工具、
Spring框架的
IoC容器……這些案例既能讓讀者鞏固每章的知識,又可以讓讀者學以致用、激發編程自豪感,進而引爆內心的編程激情。
第二版
作 者:李剛編著
出 版 社:電子工業出版社
出版時間: 2008-9-1
頁 數: 844頁
開 本: 16開
ISBN 978-7-121-15578-9
分類: 圖書 >> 計算機/編程 >>Java程式設計
定價:¥109.00元(含光碟1張)
內容概述
本書是《瘋狂Java講義的第二版》的1第二版,第二版保證了第一版系統、全面、講解淺顯、細緻的特性。全面介紹了新增的Java7新特性。
本書深入介紹了Java編程的相關方面,全書內容覆蓋了Java的基本語法結構、Java的面向對象特徵、Java集合框架體系、Java泛型、異常處理、Java GUI編程、JDBC資料庫編程、Java注釋、Java的IO流體系、Java多執行緒編程、Java網路通訊編程和Java反射機制;覆蓋了Java.lang、Java.util、Java.text、Java.io和Java.nio、Java.sql、Java.awt、Javax.swing包下絕大部分類和接口。本書全面介紹了Java7的二進制數、棱形語法、增強switch語句、多異常捕獲、自動關閉資源的try語句、JDBC4.1新特性、NIO.2、AIO等新特性。
與第一版類似,本書不單純從知識角度來講解Java,而是從解決問題的角度來介紹Java語言,所以本書涉及大量的實用案例開發;五子棋遊戲、梭哈遊戲、仿QQ的遊戲大廳、MySQL企業管理器、仿Editplus的文本編輯器、多執行緒、斷點下載遊戲、Spring框架的IoC容器…這些案例既能讓讀者鞏固每章的知識,又可以讓讀者學以致用,激發編程自豪感,進而引爆內心的編程激情。本書光碟里包含書中所有事例的代碼和《瘋狂Java實戰演義》的所有項目代碼,這些項目可以作為本書課後練習的“非標準答案”。
本書為所有打算深入掌握Java編程的讀者而編寫,適合各種層次的Java學習者和工作者閱讀,也適合作為大學教育、培訓機構的Java教材。但如果只是簡單涉獵Java,則本書過於龐大,不適合閱讀。
作者簡介
李剛從事8年的Java EE套用開發。
曾任LITEON公司的J2EE技術主管,負責該公司的企業信息平台的架構設計。
曾任廣州電信、廣東龍泉科技等公司的技術培訓導師。
2007年3月26日的《電腦報》專訪人物。
現任新東方IT培訓廣州中心軟體教學總監,曾兼任廣東技術師範學院計算機科學系的兼職副教授。
培訓的學生已在華為、立信、普信、網易、電信盈科、中企動力等公司就職。
國內知名的高端IT技術作家,已出版《Spring2.0寶典》、《基於J2EE的Ajax寶典》、《輕量級J2EE企業套用實戰》、《Struts 2權威指南》、《Ruby On Rails敏捷開發最佳實踐》等著作。
宣傳語
暢銷書《Struts 2權威指南》作者李剛又一力作,來自作者3年的Java培訓經歷,凝結了作者近3000個小時的授課經驗,總結了幾百個Java學員學習過程中的典型錯誤。
1.案例驅動,引爆編程激情
本書中涉及了大量Java案例,致力於將知識點融入實際項目的開發,希望讀者通過編寫這些程式找到編程的樂趣。
2.再現李剛老師課堂氛圍
本書的內容是筆者授課經歷的總結,知識體系取自李剛瘋狂Java實戰課程體系。力求以淺顯比喻代替乏味的講解,以瘋狂實戰代替空洞的理論。
3.注釋詳細,輕鬆上手
書中代碼的注釋非常詳細,幾乎每兩行代碼就有一行注釋,甚至還把一些簡單理論作為注釋穿插到代碼中,極大降低了讀者閱讀的難度。
創作理念
上善若水——兼談我的創作理念
上善若水,水善利萬物而不爭,處眾人之所惡,故幾於道——《老子》
在泱泱中華浩如煙海的典籍中,我獨喜歡這句話,它仿佛一句箴言,揭示著人生最平實,卻最深奧的輪迴。在蒼茫天地之間,只有水的姿態如此絢麗多姿:在天,為云為雯,絢麗華美;在谷,為川為淵,洶湧浩瀚;在地,為陵為山,晶瑩剔透。
常常想忍不住,怎樣的人生才可做到“若水”?
經歷多年軟體開發後,我暫時性地離開了一線開發崗位,開始了新東方IT培訓中心的Java講師生涯,也開始做一些技術諮詢、員工培訓等工作,成為了一個軟體開發的布道者。
在後來的日子裡,我覺得這是一種輪迴:一種從學習到學習的輪迴。不同的是:多年前,學習的是我;學習的是我的學生、我的客戶。因為這種輪迴,有機會重新回顧我當年的苦難:心裡飽含萬千學習激情,但一個又一個的問題迎面撲過來,這種激情是否還會持久?
學生告訴我:學習是一件很快樂的事情,特別是解決後問題後真的很快樂!但如果一個問題折騰2天都得不到正確答案,那就非常不快樂!
從他們的話中,我悟到一個道理:何謂快樂?我想,快樂是經過千辛萬苦後抵達目的後的滿足感。快樂有如下等式:快樂=千辛萬苦+抵達目的。如果整個過程只剩下千辛萬苦,沒有抵達目的,那么所有的千辛萬苦就等於零了。如同上帝罰西緒弗推石頭,每天重複推同一塊石頭上山,那就變成了懲罰!
有感於此,我創作的圖書目的是希望能帶給學習者快樂,如果他們正經歷著軟體開發中百轉千回的挫折,他們可以從圖書找到問題的解決方案。因此我所創作系列圖書只有一個目的:解決問題,解決各種實際問題。整個創作過程中,堅持以解決開發問題為目的,以知識內在邏輯為主線,以淺顯直白為方式,希望可以帶給閱讀者快樂。
創作過程,我不願意使用那些太過專業的概念,而是先介紹各知識點的用法,以及對應的知識點語法,而各種專業概念,我寧願放在最後介紹!不得不承認,計算機領域的專業概念是如此層出不窮,又如此詞不達意!例如網路編程中的
Socket,不知道哪位“天才”將其翻譯成“套接字”,這多年前曾是我的惡夢;再如時下流行的AOP編程中的Advice,有的說是建議,有的說是通知,完全是不知所云!這種名稱,對初學者該是怎樣的折磨啊!
常常會想:這些概念的名稱很重要嗎?為什麼一定要給它們一個如此“深奧”的名稱?例如講解方法重寫時,我歸納出方法重寫的規則:兩同兩小一大,分別是父類、子類的方法名相同、參數列表相同,子類方法返回值類型相同或更小、子類方法拋出的異常相同或者更小,子類方法的訪問控制相等或者更大。當我的學生去面試時,給他的面試官介紹這條規則時,他的面試官連聲質問他:什麼叫異常更小?異常之間只有父子關係,沒有大小關係!(實際上,從父類到子類,就是一般到特殊的關係。因此可以認為子類的範圍比父類的範圍更小,就如蘋果類的範圍比水果類的範圍更小)這是一種現狀:大部分人熱衷於那些很正規、但陳腐的說法,很少有人願意“化神奇為腐朽”。
堅持認為:化神奇為腐朽可能需要更深厚的知識,更高的視角才可達到這種境界。不管人類知識如何演變、如何複雜,各種知識都是具有極深的關聯、類比的,即使是某些十分晦澀的知識點,等真正明白了它的含義後,一定會發現它類似於日常生活中最平常的事情。例如介紹設計模式的圖書,大多說得非常專業、甚至有點神乎其技。但我更願意這樣介紹設計模式:當你看到一條水溝橫亘在你的面前,你應該跳過去,而不是再繼續前走!這就是設計模式。但如果一個初學者對一個所謂“高手”介紹這個定義時,一定又會被連聲質問。
創作一本圖書時,目的很重要!因為我的目的是解決問題,帶給讀者快樂。因此我希望用最司空見慣的示例,類比最深奧的知識,希望讓讀者從最平常的知識,過渡到那些所謂的專業知識。幫助讀者找到晦澀知識和日常知識之間類比,從而讓讀者產生“所謂某某某知識,原來不過如此”的感覺!
很多所謂的“高手”,積累了一定的知識,但遠遠沒有達到“悟”的境界,大部分時候只會人云亦云,卻往往以為自己掌握的才是最正確的真理!這是學術界永恆的悲哀,一如布魯諾被燒死在羅馬鮮花廣場上一樣悲哀!而國內的開發界更多浮躁,我所面試的老師大都是某公司技術經理、項目經理,甚至包括某大型IT培訓結構跳槽的老師,但當要求他們寫一個簡單的網路通信程式時,他們卻往往理由很多:沒有文檔、沒有IDE工具、不能上網查資料、準備不充分……他們的理由比他們的知識多!可能這是中國大部分程式設計師的現狀:他們都是“高手”,動輒精通“Java、C++”,但一旦要求當場完成一個小程式則困難重重!實際上,很多學生經跟我學習一個月後,就可以完成一個模擬QQ線上遊戲大廳的套用,再晚一點,可以開發出MySQL企業管理器(功能與MySQLFront相同)。但我卻一直告誡他們:你們還很差,還需要更多積累!
改變這種浮囂!是我創作圖書另一個目的。整個創作過程中,一直堅持“代碼就是硬道理”的準則,堅持把所有的知識點以小套用的方式演示出來。因為:程式是寫出來,而不是說出來的。讀者可以從我所創作的系列圖書中,每本都可以看到豐富的代碼範例。
創作一本圖書是很辛苦的事情,甚至有些得不償失。曾有人告訴我,如果你想通過寫書來賺錢,你應該寫“如何上網”、“如何使用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