瘋狂Java講義(第5版) ( 簡體 字) |
作者:李剛 | 類別:1. -> 程式設計 -> JAVA -> Java |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 50976 詢問書籍請說出此書號!【缺書】 NT售價: 695 元 |
出版日:4/1/2019 |
頁數:912 |
光碟數:1 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121361586 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:2018年9月25日,Oracle如約發布了Java 11正式版。正如Oracle官方宣布的,Java不再基于功能特征來發布新版本,而是改為基于時間來發布新版本:固定每半年發布一個版本,但每3年才發布一個長期支持版(LTS),其他所有版本將被稱為“功能性版本”,都只有6個月的維護期。Java 11是Java 8之后第一個長期支持版,因此建議廣大開發者逐步過渡到Java 11。 另外,一個關于Java的傳言是Java要收費了,這個消息不免引起Java開發者的不安,所以這里也順便把關于“Java收費”的問題講一講。 (1)如果不想升級Java,而是繼續使用Java 8,是否要收費?當然不收費!只是個人版的Java 8在2020年12月之后不再提供免費更新;商業版的Java 8在2019年1月之后不再提供免費更新。 (2)如果希望繼續得到Java 8的更新怎么辦?根據不同的JDK廠商規則可能需要收費,有些廠商JDK依然免費,Oracle JDK需要收費。 (3)希望升級到Java 11,但是否可以繼續免費?當然可以!典型的Open JDK就是一直免費的。此外,還有不少第三方廠商的JDK(比如Amazon的JDK)都是免費的。 (4)如果我的應用采用基于GPL協議的Open JDK,那么該應用是否也需要開源?不需要!建議認真閱讀GPL協議,而不是看那些以訛傳訛的網文。 為了向廣大工作者、學習者介紹最新、最前沿的Java知識,在Java 11正式發布之前,筆者已經深入研究過Java 11絕大部分可能新增的功能;當Java 11正式發布之后,筆者在第一時間開始了《瘋狂Java講義》(第5版)的升級:使用Java 11改寫了全書所有程序,全面介紹了Java 11的各種新特性。 在以“瘋狂Java體系”圖書為教材的瘋狂軟件教育中心(www.fkjava.org),經常有學生詢問:為什么叫瘋狂Java這個名字?也有一些讀者通過網絡、郵件來詢問這個問題。其實這個問題的答案可以在本書第1版的前言中找到。瘋狂的本質是一種“享受編程”的狀態。在一些不了解編程的人看來:編程的人總面對著電腦,在鍵盤上敲打,這種生活實在太枯燥了,但實際上是因為他們并未真正了解編程,并未真正走進編程。在外人眼中:程序員不過是在敲打鍵盤;但在程序員心中:程序員敲出的每個字符,都是程序的一部分。 程序是什么呢?程序是對現實世界的數字化模擬。開發一個程序,實際是創造一個或大或小的“模擬世界”。在這個過程中,程序員享受著“創造”的樂趣,程序員沉醉在他所創造的“模擬世界”里:瘋狂地設計、瘋狂地編碼實現。實現過程不斷地遇到問題,然后解決它;不斷地發現程序的缺陷,然后重新設計、修復它—這個過程本身就是一種享受。一旦完全沉浸到編程世界里,程序員是“物我兩忘”的,眼中看到的、心中想到的,只有他正在創造的“模擬世界”。 在學會享受編程之前,編程學習者都應該采用“案例驅動”的方式,學習者需要明白程序的作用是:解決問題—如果你的程序不能解決你自己的問題,如何期望你的程序去解決別人的問題呢?那你的程序的價值何在?—知道一個知識點能解決什么問題,才去學這個知識點,而不是盲目學習!因此本書強調編程實戰,強調以項目激發編程興趣。 僅僅只是看完這本書,你不會成為高手!在編程領域里,沒有所謂的“武林秘笈”,再好的書一定要配合大量練習,否則書里的知識依然屬于作者,而讀者則仿佛身入寶山而一無所獲的笨漢。本書配合了大量高強度的練習,希望讀者強迫自己去完成這些項目。這些習題的答案可以參考本書所附光盤中《瘋狂Java實戰演義》的配套代碼。如果需要獲得編程思路和交流,可以登錄http://www.crazyit.org與廣大讀者和筆者交流。 本書前4版面市的十多年時間里,無數讀者已經通過本書步入了Java編程世界,而且每一版的銷量比上一版都有大幅提升,這說明“青山遮不住”,優秀的作品,經過時間的沉淀,往往歷久彌新。再次衷心感謝廣大讀者的支持,你們的認同和支持是筆者堅持創作的最大動力。 《瘋狂Java講義(第3版)》的優秀,也吸引了中國臺灣地區的讀者,因此中國臺灣地區的出版社成功引進并翻譯了繁體版的《瘋狂Java講義》,相信繁體版的《瘋狂Java講義》能更好地服務于中國臺灣地區的Java學習者。 廣大讀者對瘋狂Java的肯定,讀者認同、贊譽既讓筆者十分欣慰,也鞭策筆者以更高的熱情、更嚴謹的方式創作圖書。時至今日,每次筆者創作或升級圖書時,總有一種誠惶誠恐、如履薄冰的感覺,惟恐辜負廣大讀者的厚愛。 筆者非常歡迎所有熱愛編程、愿意推動中國軟件業的學習者、工作者對本書提出寶貴的意見,非常樂意與大家交流。中國軟件業還處于發展階段,所有熱愛編程、愿意推動中國軟件業的人應該聯合起來,共同為中國軟件行業貢獻自己的綿薄之力。 本書有什么特點 本書并不是一本簡單的Java入門教材,也不是一門“閉門造車”式的Java讀物。本書來自筆者十余年的Java培訓經歷,凝結了筆者一萬余小時的授課經驗,總結了數千名Java學員學習過程中的典型錯誤。 因此,本書具有如下三個特點: 1.案例驅動,引爆編程激情 本書不再是知識點的鋪陳,而是致力于將知識點融入實際項目的開發中,所以本書中涉及了大量Java案例:仿QQ的游戲大廳、MySQL企業管理器、仿EditPlus的文本編輯器、多線程、斷點下載工具……希望讀者通過編寫這些程序找到編程的樂趣。 2.再現李剛老師課堂氛圍 本書的內容是筆者十余年授課經歷的總結,知識體系取自瘋狂Java實戰的課程體系。 本書力求再現筆者的課堂氛圍:以淺顯比喻代替乏味的講解,以瘋狂實戰代替空洞的理論。 書中包含了大量“注意”“學生提問”部分,這些正是數千名Java學員所犯錯誤的匯總。 3.注釋詳細,輕松上手 為了降低讀者閱讀的難度,書中代碼的注釋非常詳細,幾乎每兩行代碼就有一行注釋。不僅如此,本書甚至還把一些簡單理論作為注釋穿插到代碼中,力求讓讀者能輕松上手。 本書所有程序中關鍵代碼均以粗體字標出,也是為了幫助讀者能迅速找到這些程序的關鍵點。 本書寫給誰看 如果你僅僅想對Java有所涉獵,那么本書并不適合你;如果你想全面掌握Java語言,并使用Java來解決問題、開發項目,或者希望以Java編程作為你的職業,那么本書將非常適合你。希望本書能引爆你內心潛在的編程激情,如果本書能讓你產生廢寢忘食的感覺,那筆者就非常欣慰了。 2019-01-22 |
內容簡介:(含DVD光盤一張) 本書是《瘋狂Java講義》的第5版,第5版保持了前4版系統、全面、講解淺顯、細致的特性,全面新增介紹了Java 10、Java 11的新特性。本書深入介紹了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包下絕大部分類和接口。本書重點介紹了Java的模塊化系統,還詳細介紹了Java 10、Java 11的使用var聲明局部變量、在Lambda表達式中使用var聲明變量、改進的javac命令、基于嵌套的訪問控制、HTTP Client網絡編程,以及Java 10、Java 11新增的各種API功能。與前4版類似,本書并不單純從知識角度來講解Java,而是從解決問題的角度來介紹Java語言,所以本書中涉及大量實用案例開發:五子棋游戲、梭哈游戲、仿QQ的游戲大廳、MySQL企業管理器、仿EditPlus的文本編輯器、多線程、斷點下載工具、Spring框架的IoC容器……這些案例既能讓讀者鞏固每章的知識,又可以讓讀者學以致用,激發編程自豪感,進而引爆內心的編程激情。本書光盤里包含書中所有示例的代碼和《瘋狂Java實戰演義》的所有項目代碼,這些項目可以作為本書課后練習的“非標準答案”,如果讀者需要獲取關于課后習題的解決方法、編程思路,可以登錄站點與筆者及本書龐大的讀者群相互交流。本書為所有打算深入掌握Java編程的讀者而編寫,適合各種層次的Java學習者和工作者閱讀,也適合作為大學教育、培訓機構的Java教材。但如果只是想簡單涉獵Java,則本書過于龐大,不適合閱讀。 |
目錄:第1章 Java語言概述與開發環境 1 1.1 Java語言的發展簡史 2 1.2 Java程序運行機制 4 1.2.1 高級語言的運行機制 4 1.2.2 Java程序的運行機制和JVM 5 1.3 開發Java的準備 6 1.3.1 下載和安裝Java 11的JDK 6 不是說JVM是運行Java程序的虛擬機嗎?那JRE和JVM的關系是怎樣的呢? 7 1.3.2 設置PATH環境變量 9 為什么選擇用戶變量?用戶變量與系統變量有什么區別? 10 1.4 第一個Java程序 10 1.4.1 編輯Java源代碼 10 1.4.2 編譯Java程序 11 當編譯C程序時,不僅需要指定存放目標文件的位置,也需要指定目標文件的文件名,這里使用javac編譯Java程序時怎么不需要指定目標文件的文件名呢? 11 1.4.3 運行Java程序 12 1.4.4 根據CLASSPATH環境變量定位類 13 1.5 Java程序的基本規則 14 1.5.1 Java程序的組織形式 14 1.5.2 Java源文件的命名規則 14 1.5.3 初學者容易犯的錯誤 15 1.6 交互式工具:jshell 17 1.7 Java 11改進的垃圾回收器 18 1.8 何時開始使用IDE工具 20 我想學習Java編程,到底是學習Eclipse好,還是學習IntelliJ IDEA好呢? 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 用例圖 31 2.2.2 類圖 31 2.2.3 組件圖 33 2.2.4 部署圖 34 2.2.5 順序圖 34 2.2.6 活動圖 35 2.2.7 狀態機圖 36 2.3 Java的面向對象特征 37 2.3.1 一切都是對象 37 2.3.2 類和對象 37 2.4 本章小結 38
第3章 數據類型和運算符 39 3.1 注釋 40 3.1.1 單行注釋和多行注釋 40 3.1.2 文檔注釋 41 API文檔是什么? 41 為什么要學習查看API文檔的方法? 43 3.2 標識符和關鍵字 47 3.2.1 分隔符 47 3.2.2 標識符規則 49 3.2.3 Java關鍵字 49 3.3 數據類型分類 50 什么是變量?變量有什么用? 50 3.4 基本數據類型 51 3.4.1 整型 51 3.4.2 字符型 53 什么是字符集? 53 3.4.3 浮點型 54 3.4.4 數值中使用下畫線分隔 56 3.4.5 布爾型 56 3.4.6 使用var定義變量 57 3.5 基本類型的類型轉換 58 3.5.1 自動類型轉換 58 3.5.2 強制類型轉換 59 3.5.3 表達式類型的自動提升 61 3.6 直接量 62 3.6.1 直接量的類型 62 3.6.2 直接量的賦值 62 3.7 運算符 63 3.7.1 算術運算符 63 3.7.2 賦值運算符 66 3.7.3 位運算符 66 3.7.4 擴展后的賦值運算符 68 3.7.5 比較運算符 69 3.7.6 邏輯運算符 70 3.7.7 三目運算符 71 3.7.8 運算符的結合性和優先級 72 3.8 本章小結 73 本章練習 73
第4章 流程控制與數組 74 4.1 順序結構 75 4.2 分支結構 75 4.2.1 if條件語句 75 4.2.2 Java 11改進的switch分支語句 79 4.3 循環結構 81 4.3.1 while循環語句 81 4.3.2 do while循環語句 82 4.3.3 for循環 83 4.3.4 嵌套循環 86 4.4 控制循環結構 87 4.4.1 使用break結束循環 87 4.4.2 使用continue忽略本次循環剩下語句 88 4.4.3 使用return結束方法 89 4.5 數組類型 90 4.5.1 理解數組:數組也是一種類型 90 int[]是一種類型嗎?怎么使用這種類型呢? 90 4.5.2 定義數組 90 4.5.3 數組的初始化 91 能不能只分配內存空間,不賦初始值呢? 91 4.5.4 使用數組 93 為什么要我記住這些異常信息? 93 4.5.5 foreach循環 94 4.6 深入數組 95 4.6.1 內存中的數組 95 為什么有棧內存和堆內存之分? 96 4.6.2 基本類型數組的初始化 97 4.6.3 引用類型數組的初始化 98 4.6.4 沒有多維數組 100 我是否可以讓圖4.13中灰色覆蓋的數組元素再次指向另一個數組?這樣不就可以擴展成三維數組,甚至擴展成更多維的數組嗎? 102 4.6.5 操作數組的工具類:Arrays 103 4.6.6 數組應用舉例 106 4.7 本章小結 109 本章練習 109
第5章 面向對象(上) 110 5.1 類和對象 111 5.1.1 定義類 111 構造器不是沒有返回值嗎?為什么不能用void聲明呢? 113 5.1.2 對象的產生和使用 114 5.1.3 對象、引用和指針 114 5.1.4 對象的this引用 116 5.2 方法詳解 119 5.2.1 方法的所屬性 119 5.2.2 方法的參數傳遞機制 120 5.2.3 形參個數可變的方法 124 5.2.4 遞歸方法 125 5.2.5 方法重載 126 為什么方法的返回值類型不能用于區分重載的方法? 127 5.3 成員變量和局部變量 127 5.3.1 成員變量和局部變量 128 5.3.2 成員變量的初始化和內存中的運行機制 131 5.3.3 局部變量的初始化和內存中的運行機制 133 5.3.4 變量的使用規則 133 5.4 隱藏和封裝 134 5.4.1 理解封裝 134 5.4.2 使用訪問控制符 135 5.4.3 package、import和import static 138 5.4.4 Java的常用包 142 5.5 深入構造器 142 5.5.1 使用構造器執行初始化 142 構造器是創建Java對象的途徑,是不是說構造器完全負責創建Java對象? 143 5.5.2 構造器重載 144 為什么要用this來調用另一個重載的構造器?我把另一個構造器里的代碼復制、粘貼到這個構造器里不就可以了嗎? 145 5.6 類的繼承 145 5.6.1 繼承的特點 145 5.6.2 重寫父類的方法 147 5.6.3 super限定 148 5.6.4 調用父類構造器 150 為什么我創建Java對象時從未感覺到java.lang. Object類的構造器被調用過? 152 5.7 多態 152 5.7.1 多態性 153 5.7.2 引用變量的強制類型轉換 154 5.7.3 instanceof運算符 156 5.8 繼承與組合 156 5.8.1 使用繼承的注意點 157 5.8.2 利用組合實現復用 158 使用組合關系來實現復用時,需要創建兩個Animal對象,是不是意味著使用組合關系時系統開銷更大? 160 5.9 初始化塊 161 5.9.1 使用初始化塊 161 5.9.2 實例初始化塊和構造器 163 5.9.3 類初始化塊 163 5.10 本章小結 166 本章練習 166
第6章 面向對象(下) 167 6.1 包裝類 168 Java為什么要對這些數據進行緩存呢? 171 6.2 處理對象 172 6.2.1 打印對象和toString方法 172 6.2.2 ==和equals方法 174 上面程序中判斷obj是否為Person類的實例時,為何不用obj instanceof Person來判斷呢? 177 6.3 類成員 177 6.3.1 理解類成員 177 6.3.2 單例(Singleton)類 178 6.4 final修飾符 179 6.4.1 final成員變量 180 6.4.2 final局部變量 182 6.4.3 final修飾基本類型變量和引用類型變量的區別 182 6.4.4 可執行“宏替換”的final變量 183 6.4.5 final方法 185 6.4.6 final類 186 6.4.7 不可變類 186 6.4.8 緩存實例的不可變類 189 6.5 抽象類 191 6.5.1 抽象方法和抽象類 191 6.5.2 抽象類的作用 194 6.6 Java 9改進的接口 195 6.6.1 接口的概念 195 6.6.2 Java 9中接口的定義 196 6.6.3 接口的繼承 198 6.6.4 使用接口 199 6.6.5 接口和抽象類 201 6.6.6 面向接口編程 201 6.7 內部類 205 6.7.1 非靜態內部類 205 學生提問:非靜態內部類對象和外部類對象的關系是怎樣的? 208 6.7.2 靜態內部類 209 為什么靜態內部類的實例方法也不能訪問外部類的實例屬性呢? 210 學生提問:接口里是否能定義內部接口? 211 6.7.3 使用內部類 211 既然內部類是外部類的成員,那么是否可以為外部類定義子類,在子類中再定義一個內部類來重寫其父類中的內部類呢? 213 6.7.4 局部內部類 213 6.7.5 匿名內部類 214 6.8 Java 11增強的Lambda表達式 217 6.8.1 Lambda表達式入門 217 6.8.2 Lambda表達式與函數式接口 219 6.8.3 在Lambda表達式中使用var 221 6.8.4 方法引用與構造器引用 222 6.8.5 Lambda表達式與匿名內部類的聯系和區別 225 6.8.6 使用Lambda表達式調用Arrays的類方法 226 6.9 枚舉類 226 6.9.1 手動實現枚舉類 227 6.9.2 枚舉類入門 227 6.9.3 枚舉類的成員變量、方法和構造器 229 6.9.4 實現接口的枚舉類 231 枚舉類不是用final修飾了嗎?怎么還能派生子類呢? 232 6.9.5 包含抽象方法的枚舉類 232 6.10 對象與垃圾回收 233 6.10.1 對象在內存中的狀態 233 6.10.2 強制垃圾回收 234 6.10.3 finalize方法 235 6.10.4 對象的軟、弱和虛引用 236 6.11 修飾符的適用范圍 240 6.12 多版本JAR包 240 6.12.1 jar命令詳解 241 6.12.2 創建可執行的JAR包 244 6.12.3 關于JAR包的技巧 244 6.13 本章小結 245 本章練習 245
第7章 Java基礎類庫 246 7.1 與用戶互動 247 7.1.1 運行Java程序的參數 247 7.1.2 使用Scanner獲取鍵盤輸入 248 7.2 系統相關 250 7.2.1 System類 250 7.2.2 Runtime類與Java 9的ProcessHandle 252 7.3 常用類 253 7.3.1 Object類 253 7.3.2 操作對象的Objects工具類 255 7.3.3 Java 9改進的String、StringBuffer和StringBuilder類 256 7.3.4 Math類 259 7.3.5 ThreadLocalRandom與Random 261 7.3.6 BigDecimal類 262 7.4 Java 8的日期、時間類 265 7.4.1 Date類 265 7.4.2 Calendar類 266 7.4.3 新的日期、時間包 269 7.5 正則表達式 271 7.5.1 創建正則表達式 271 7.5.2 使用正則表達式 274 7.6 變量處理和方法處理 277 7.6.1 Java 9增強的MethodHandle 277 7.6.2 Java 9增加的VarHandle 278 7.7 Java 11改進的國際化與格式化 279 7.7.1 Java國際化的思路 280 7.7.2 Java支持的國家和語言 280 7.7.3 完成程序國際化 281 7.7.4 使用MessageFormat處理包含占位符的字符串 283 7.7.5 使用類文件代替資源文件 283 7.7.6 Java 9新增的日志API 284 7.7.7 使用NumberFormat格式化數字 286 7.7.8 使用DateFormat格式化日期、時間 287 7.7.9 使用SimpleDateFormat格式化日期 289 7.8 Java 8新增的日期、時間格式器 289 7.8.1 使用DateTimeFormatter完成格式化 290 7.8.2 使用DateTimeFormatter解析字符串 291 7.9 本章小結 291 本章練習 292
第8章 Java集合 293 8.1 Java集合概述 294 8.2 Java 11增強的Collection和Iterator接口 295 8.2.1 使用Lambda表達式遍歷集合 297 8.2.2 使用Iterator遍歷集合元素 298 8.2.3 使用Lambda表達式遍歷Iterator 299 8.2.4 使用foreach循環遍歷集合元素 300 8.2.5 使用Predicate操作集合 300 8.2.6 使用Stream操作集合 301 8.3 Set集合 304 8.3.1 HashSet類 304 hashCode()方法對于HashSet是不是十分重要? 306 8.3.2 LinkedHashSet類 308 8.3.3 TreeSet類 308 8.3.4 EnumSet類 314 8.3.5 各Set實現類的性能分析 316 8.4 List集合 316 8.4.1 改進的List接口和ListIterator接口 316 8.4.2 ArrayList和Vector實現類 319 8.4.3 固定長度的List 320 8.5 Queue集合 321 8.5.1 PriorityQueue實現類 321 8.5.2 Deque接口與ArrayDeque實現類 322 8.5.3 LinkedList實現類 324 8.5.4 各種線性表的性能分析 324 8.6 增強的Map集合 325 8.6.1 Java 8為Map新增的方法 327 8.6.2 改進的HashMap和Hashtable實現類 328 8.6.3 LinkedHashMap實現類 331 8.6.4 使用Properties讀寫屬性文件 332 8.6.5 SortedMap接口和TreeMap實現類 333 8.6.6 WeakHashMap實現類 335 8.6.7 IdentityHashMap實現類 336 8.6.8 EnumMap實現類 336 8.6.9 各Map實現類的性能分析 337 8.7 HashSet和HashMap的性能選項 337 8.8 操作集合的工具類:Collections 338 8.8.1 排序操作 338 8.8.2 查找、替換操作 341 8.8.3 同步控制 342 8.8.4 設置不可變集合 343 8.8.5 Java 9新增的不可變集合 343 8.9 煩瑣的接口:Enumeration 344 8.10 本章小結 345 本章練習 345
第9章 泛型 346 9.1 泛型入門 347 9.1.1 編譯時不檢查類型的異常 347 9.1.2 使用泛型 347 9.1.3 Java 9增強的“菱形”語法 348 9.2 深入泛型 350 9.2.1 定義泛型接口、類 350 9.2.2 從泛型類派生子類 351 9.2.3 并不存在泛型類 353 9.3 類型通配符 353 9.3.1 使用類型通配符 355 9.3.2 設定類型通配符的上限 355 9.3.3 設定類型通配符的下限 357 9.3.4 設定泛型形參的上限 359 9.4 泛型方法 359 9.4.1 定義泛型方法 360 9.4.2 泛型方法和類型通配符的區別 362 9.4.3 “菱形”語法與泛型構造器 363 9.4.4 泛型方法與方法重載 364 9.4.5 類型推斷 365 9.5 擦除和轉換 366 9.6 泛型與數組 367 9.7 本章小結 368
第10章 異常處理 369 10.1 異常概述 370 10.2 異常處理機制 371 10.2.1 使用try...catch捕獲異常 371 10.2.2 異常類的繼承體系 373 10.2.3 多異常捕獲 376 10.2.4 訪問異常信息 376 10.2.5 使用finally回收資源 377 10.2.6 異常處理的嵌套 379 10.2.7 Java 9增強的自動關閉資源的try語句 380 10.3 Checked異常和Runtime異常體系 381 10.3.1 使用throws聲明拋出異常 382 10.3.2 方法重寫時聲明拋出異常的限制 383 10.4 使用throw拋出異常 383 10.4.1 拋出異常 383 10.4.2 自定義異常類 385 10.4.3 catch和throw同時使用 386 10.4.4 使用throw語句拋出異常 387 10.4.5 異常鏈 387 10.5 Java的異常跟蹤棧 389 10.6 異常處理規則 391 10.6.1 不要過度使用異常 391 10.6.2 不要使用過于龐大的try塊 392 10.6.3 避免使用Catch All語句 392 10.6.4 不要忽略捕獲到的異常 393 10.7 本章小結 393 本章練習 393
第11章 AWT編程 394 11.1 Java改進的GUI(圖形用戶界面)和AWT 395 11.2 AWT容器 396 11.3 布局管理器 399 11.3.1 FlowLayout布局管理器 399 11.3.2 BorderLayout布局管理器 400 BorderLayout最多只能放置5個組件嗎?那它也太不實用了吧? 401 11.3.3 GridLayout布局管理器 402 11.3.4 GridBagLayout布局管理器 403 11.3.5 CardLayout布局管理器 406 11.3.6 絕對定位 407 11.3.7 BoxLayout布局管理器 408 圖11.15和圖11.16顯示的所有按鈕都緊挨在一起,如果希望像FlowLayout、GridLayout等布局管理器那樣指定組件的間距應該怎么辦? 409 11.4 AWT常用組件 410 11.4.1 基本組件 410 11.4.2 對話框(Dialog) 412 11.5 事件處理 414 11.5.1 Java事件模型的流程 414 11.5.2 事件和事件監聽器 416 11.5.3 事件適配器 420 11.5.4 使用內部類實現監聽器 421 11.5.5 使用外部類實現監聽器 421 11.5.6 類本身作為事件監聽器類 422 11.5.7 匿名內部類實現監聽器 423 11.6 AWT菜單 424 11.6.1 菜單條、菜單和菜單項 424 11.6.2 右鍵菜單 426 為什么即使我沒有給多行文本域編寫右鍵菜單,但當我在多行文本域上單擊右鍵時也一樣會彈出右鍵菜單? 427 11.7 在AWT中繪圖 428 11.7.1 畫圖的實現原理 428 11.7.2 使用Graphics類 428 11.8 處理位圖 433 11.8.1 Image抽象類和BufferedImage實現類 433 11.8.2 Java 9增強的ImageIO 435 11.9 剪貼板 439 11.9.1 數據傳遞的類和接口 439 11.9.2 傳遞文本 440 11.9.3 使用系統剪貼板傳遞圖像 441 11.9.4 使用本地剪貼板傳遞對象引用 444 11.9.5 通過系統剪貼板傳遞Java對象 446 11.10 拖放功能 449 11.10.1 拖放目標 449 11.10.2 拖放源 452 11.11 本章小結 454 本章練習 454
第12章 Swing編程 455 12.1 Swing概述 456 12.2 Swing基本組件的用法 457 12.2.1 Swing組件層次 457 12.2.2 AWT組件的Swing實現 458 為什么單擊Swing多行文本域時不是彈出像AWT多行文本域中的右鍵菜單? 464 12.2.3 為組件設置邊框 464 12.2.4 Swing組件的雙緩沖和鍵盤驅動 466 12.2.5 使用JToolBar創建工具條 467 12.2.6 使用JFileChooser和JColorChooser 469 12.2.7 使用JOptionPane 476 12.3 Swing中的特殊容器 481 12.3.1 使用JSplitPane 481 12.3.2 使用JTabbedPane 483 12.3.3 使用JLayeredPane、JDesktopPane和JInternalFrame 487 12.4 Swing簡化的拖放功能 494 12.5 Java 7新增的Swing功能 495 12.5.1 使用JLayer裝飾組件 496 12.5.2 創建透明、不規則形狀窗口 501 12.6 使用JProgressBar、ProgressMonitor和BoundedRangeModel創建進度條 503 12.6.1 創建進度條 503 12.6.2 創建進度對話框 507 12.7 使用JSlider和BoundedRangeModel創建滑動條 508 12.8 使用JSpinner和SpinnerModel創建微調控制器 511 12.9 使用JList、JComboBox創建列表框 514 12.9.1 簡單列表框 514 12.9.2 不強制存儲列表項的ListModel和ComboBoxModel 517 12.9.3 強制存儲列表項的DefaultListModel和 DefaultComboBoxModel 520 為什么JComboBox提供了添加、刪除列表項的方法?而JList沒有提供添加、刪除列表項的方法呢? 522 12.9.4 使用ListCellRenderer改變列表項外觀 522 12.10 使用JTree和TreeModel創建樹 524 12.10.1 創建樹 525 12.10.2 拖動、編輯樹節點 528 12.10.3 監聽節點事件 532 12.10.4 使用DefaultTreeCellRenderer改變節點外觀 533 12.10.5 擴展DefaultTreeCellRenderer改變節點外觀 535 12.10.6 實現TreeCellRenderer改變節點外觀 537 12.11 使用JTable和TableModel創建表格 539 12.11.1 創建表格 539 我們指定的表格數據、表格列標題都是Object類型的數組,JTable如何顯示這些Object對象? 540 12.11.2 TableModel和監聽器 544 12.11.3 TableColumnModel和監聽器 549 12.11.4 實現排序 552 12.11.5 繪制單元格內容 554 12.11.6 編輯單元格內容 557 12.12 使用JFormattedTextField和JTextPane創建格式文本 561 12.12.1 監聽Document的變化 561 12.12.2 使用JPasswordField 563 12.12.3 使用JFormattedTextField 564 12.12.4 使用JEditorPane 572 12.12.5 使用JTextPane 572 12.13 本章小結 579 本章練習 579
第13章 MySQL數據庫與JDBC編程 580 13.1 JDBC基礎 581 13.1.1 JDBC簡介 581 13.1.2 JDBC驅動程序 582 13.2 SQL語法 583 13.2.1 安裝數據庫 583 13.2.2 關系數據庫基本概念和MySQL基本命令 585 13.2.3 SQL語句基礎 587 13.2.4 DDL語句 588 13.2.5 數據庫約束 592 13.2.6 索引 599 13.2.7 視圖 600 13.2.8 DML語句語法 601 13.2.9 單表查詢 603 13.2.10 數據庫函數 607 13.2.11 分組和組函數 609 13.2.12 多表連接查詢 611 13.2.13 子查詢 615 13.2.14 集合運算 616 13.3 JDBC的典型用法 617 13.3.1 JDBC 4.2常用接口和類簡介 617 13.3.2 JDBC編程步驟 619 前面給出的僅僅是MySQL和Oracle兩種數據庫的驅動,我看不出驅動類字符串有什么規律啊。如果我希望使用其他數據庫,那怎么找到其他數據庫的驅動類呢? 620 13.4 執行SQL語句的方式 622 13.4.1 使用executeLargeUpdate方法執行DDL和DML語句 622 13.4.2 使用execute方法執行SQL語句 624 13.4.3 使用PreparedStatement執行SQL語句 625 13.4.4 使用CallableStatement調用存儲過程 629 13.5 管理結果集 631 13.5.1 可滾動、可更新的結果集 631 13.5.2 處理Blob類型數據 633 13.5.3 使用ResultSetMetaData分析結果集 638 13.6 使用RowSet 1.1包裝結果集 640 13.6.1 RowSetFactory與RowSet 641 13.6.2 離線RowSet 642 13.6.3 離線RowSet的查詢分頁 644 13.7 事務處理 645 13.7.1 事務的概念和MySQL事務支持 645 13.7.2 JDBC的事務支持 647 13.7.3 使用批量更新 648 13.8 分析數據庫信息 650 13.8.1 使用DatabaseMetaData分析數據庫信息 650 13.8.2 使用系統表分析數據庫信息 652 13.8.3 選擇合適的分析方式 652 13.9 使用連接池管理連接 653 13.9.1 DBCP數據源 653 13.9.2 C3P0數據源 654 13.10 本章小結 655 本章練習 655
第14章 注解(Annotation) 656 14.1 基本注解 657 14.1.1 限定重寫父類方法:@Override 657 14.1.2 Java 9增強的@Deprecated 658 14.1.3 抑制編譯器警告:@SuppressWarnings 659 14.1.4 “堆污染”警告與Java 9增強的@SafeVarargs 659 14.1.5 函數式接口與@FunctionalInterface 660 14.2 JDK的元注解 661 14.2.1 使用@Retention 661 14.2.2 使用@Target 662 14.2.3 使用@Documented 662 14.2.4 使用@Inherited 663 14.3 自定義注解 664 14.3.1 定義注解 664 14.3.2 提取注解信息 665 14.3.3 使用注解的示例 667 14.3.4 重復注解 671 14.3.5 類型注解 673 14.4 編譯時處理注解 674 14.5 本章小結 678
第15章 輸入/輸出 679 15.1 File類 680 15.1.1 訪問文件和目錄 680 15.1.2 文件過濾器 682 15.2 理解Java的IO流 683 15.2.1 流的分類 683 15.2.2 流的概念模型 684 15.3 字節流和字符流 685 15.3.1 InputStream和Reader 685 15.3.2 OutputStream和Writer 687 15.4 輸入/輸出流體系 688 15.4.1 處理流的用法 689 15.4.2 輸入/輸出流體系 689 15.4.3 轉換流 692 怎么沒有把字符流轉換成字節流的轉換流呢? 692 15.4.4 推回輸入流 693 15.5 重定向標準輸入/輸出 694 15.6 Java虛擬機讀寫其他進程的數據 695 15.7 RandomAccessFile 698 15.8 Java 9改進的對象序列化 701 15.8.1 序列化的含義和意義 701 15.8.2 使用對象流實現序列化 701 15.8.3 對象引用的序列化 703 15.8.4 Java 9增加的過濾功能 707 15.8.5 自定義序列化 708 15.8.6 另一種自定義序列化機制 713 15.8.7 版本 714 15.9 NIO 715 15.9.1 Java新IO概述 715 15.9.2 使用Buffer 716 15.9.3 使用Channel 719 15.9.4 字符集和Charset 721 二進制序列與字符之間如何對應呢? 722 15.9.5 文件鎖 723 15.10 NIO.2的功能和用法 725 15.10.1 Path、Paths和Files核心API 725 15.10.2 使用FileVisitor遍歷文件和目錄 726 15.10.3 使用WatchService監控文件變化 728 15.10.4 訪問文件屬性 729 15.11 本章小結 730 本章練習 731
第16章 多線程 732 16.1 線程概述 733 16.1.1 線程和進程 733 16.1.2 多線程的優勢 734 16.2 線程的創建和啟動 735 16.2.1 繼承Thread類創建線程類 735 16.2.2 實現Runnable接口創建線程類 736 16.2.3 使用Callable和Future創建線程 737 16.2.4 創建線程的三種方式對比 739 16.3 線程的生命周期 739 16.3.1 新建和就緒狀態 739 16.3.2 運行和阻塞狀態 741 16.3.3 線程死亡 742 16.4 控制線程 743 16.4.1 join線程 743 16.4.2 后臺線程 744 16.4.3 線程睡眠:sleep 745 16.4.4 改變線程優先級 746 16.5 線程同步 747 16.5.1 線程安全問題 747 16.5.2 同步代碼塊 749 16.5.3 同步方法 751 16.5.4 釋放同步監視器的鎖定 753 16.5.5 同步鎖(Lock) 753 16.5.6 死鎖及常用處理策略 755 16.6 線程通信 757 16.6.1 傳統的線程通信 757 16.6.2 使用Condition控制線程通信 761 16.6.3 使用阻塞隊列(BlockingQueue)控制線程通信 763 16.7 線程組和未處理的異常 766 16.8 線程池 768 16.8.1 使用線程池管理線程 768 16.8.2 使用ForkJoinPool利用多CPU 770 16.9 線程相關類 773 16.9.1 ThreadLocal類 773 16.9.2 包裝線程不安全的集合 775 16.9.3 線程安全的集合類 776 16.9.4 Java 9新增的發布-訂閱框架 777 16.10 本章小結 779 本章練習 779
第17章 網絡編程 780 17.1 網絡編程的基礎知識 781 17.1.1 網絡基礎知識 781 17.1.2 IP地址和端口號 782 17.2 Java的基本網絡支持 783 17.2.1 使用InetAddress 783 17.2.2 使用URLDecoder和URLEncoder 784 17.2.3 URL、URLConnection和URLPermission 785 17.3 基于TCP協議的網絡編程 791 17.3.1 TCP協議基礎 791 17.3.2 使用ServerSocket創建TCP服務器端 792 17.3.3 使用Socket進行通信 792 17.3.4 加入多線程 795 17.3.5 記錄用戶信息 797 17.3.6 半關閉的Socket 805 17.3.7 使用NIO實現非阻塞Socket通信 806 17.3.8 使用AIO實現非阻塞通信 811 上面程序中好像沒用到??號代碼的get()方法的返回值,這兩個地方不調用get()方法行嗎? 814 17.4 基于UDP協議的網絡編程 818 17.4.1 UDP協議基礎 818 17.4.2 使用DatagramSocket發送、接收數據 818 17.4.3 使用MulticastSocket實現多點廣播 822 17.5 使用代理服務器 832 17.5.1 直接使用Proxy創建連接 833 17.5.2 使用ProxySelector自動選擇代理服務器 834 17.6 Java 11標準化的HTTP Client 836 17.6.1 發送同步GET請求 837 17.6.2 發送帶請求體的請求 838 17.6.3 發送異步請求 840 17.6.4 WebSocket客戶端支持 841 17.6.5 基于WebSocket的多人實時聊天 843 17.7 本章小結 845 本章練習 845
第18章 類加載機制與反射 846 18.1 類的加載、連接和初始化 847 18.1.1 JVM和類 847 18.1.2 類的加載 848 18.1.3 類的連接 849 18.1.4 類的初始化 849 18.1.5 類初始化的時機 850 18.2 類加載器 851 18.2.1 類加載機制 851 18.2.2 創建并使用自定義的類加載器 853 18.2.3 URLClassLoader類 856 18.3 通過反射查看類信息 857 18.3.1 獲得Class對象 858 18.3.2 從Class中獲取信息 858 18.3.3 方法參數反射 862 18.4 使用反射生成并操作對象 863 18.4.1 創建對象 863 18.4.2 調用方法 865 18.4.3 訪問成員變量值 867 18.4.4 操作數組 868 18.4.5 Java 11新增的嵌套訪問權限 870 18.5 使用反射生成JDK動態代理 871 18.5.1 使用Proxy和InvocationHandler創建動態代理 871 18.5.2 動態代理和AOP 873 18.6 反射和泛型 877 18.6.1 泛型和Class類 877 18.6.2 使用反射來獲取泛型信息 879 18.7 本章小結 880 本章練習 880
附錄A Java的模塊化系統 881 |
序: |