內容簡介
本書是《瘋狂Java講義》的第5版,第5版保持了前4版系統、全面、講解淺顯、細緻的特性,全面新增介紹了Java 10、Java 11的新特性。
《瘋狂Java講義(第5版)》深入介紹了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講義(第5版)》為所有打算深入掌握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