譯者序
前言
緻謝
第1章 Java程序設計概述 1
1.1 Java程序設計平颱 1
1.2 Java“白皮書”的關鍵術語 2
1.2.1 簡單性 2
1.2.2 麵嚮對象 2
1.2.3 分布式 3
1.2.4 健壯性 3
1.2.5 安全性 3
1.2.6 體係結構中立 4
1.2.7 可移植性 4
1.2.8 解釋型 5
1.2.9 高性能 5
1.2.10 多綫程 5
1.2.11 動態性 5
1.3 Java applet與Internet 6
1.4 Java發展簡史 7
1.5 關於Java的常見誤解 9
第2章 Java程序設計環境 12
2.1 安裝Java開發工具包 12
2.1.1 下載JDK 12
2.1.2 設置JDK 13
2.1.3 安裝庫源文件和文檔 15
2.2 使用命令行工具 16
2.3 使用集成開發環境 18
2.4 運行圖形化應用程序 21
2.5 構建並運行applet 23
第3章 Java的基本程序設計結構 28
3.1 一個簡單的Java應用程序 28
3.2 注釋 31
3.3 數據類型 32
3.3.1 整型 32
3.3.2 浮點類型 33
3.3.3 char類型 34
3.3.4 Unicode和char類型 35
3.3.5 boolean類型 35
3.4 變量 36
3.4.1 變量初始化 37
3.4.2 常量 37
3.5 運算符 38
3.5.1 數學函數與常量 39
3.5.2 數值類型之間的轉換 40
3.5.3 強製類型轉換 41
3.5.4 結閤賦值和運算符 42
3.5.5 自增與自減運算符 42
3.5.6 關係和boolean運算符 42
3.5.7 位運算符 43
3.5.8 括號與運算符級彆 44
3.5.9 枚舉類型 45
3.6 字符串 45
3.6.1 子串 45
3.6.2 拼接 46
3.6.3 不可變字符串 46
3.6.4 檢測字符串是否相等 47
3.6.5 空串與Null串 48
3.6.6 碼點與代碼單元 49
3.6.7 String API 50
3.6.8 閱讀聯機API文檔 52
3.6.9 構建字符串 54
3.7 輸入輸齣 55
3.7.1 讀取輸入 55
3.7.2 格式化輸齣 58
3.7.3 文件輸入與輸齣 61
3.8 控製流程 63
3.8.1 塊作用域 63
3.8.2 條件語句 63
3.8.3 循環 66
3.8.4 確定循環 69
3.8.5 多重選擇:switch語句 72
3.8.6 中斷控製流程語句 74
3.9 大數值 76
3.10 數組 78
3.10.1 for each循環 79
3.10.2 數組初始化以及匿名數組 80
3.10.3 數組拷貝 81
3.10.4 命令行參數 81
3.10.5 數組排序 82
3.10.6 多維數組 85
3.10.7 不規則數組 88
第4章 對象與類 91
4.1 麵嚮對象程序設計概述 91
4.1.1 類 92
4.1.2 對象 93
4.1.3 識彆類 93
4.1.4 類之間的關係 94
4.2 使用預定義類 95
4.2.1 對象與對象變量 95
4.2.2 Java類庫中的LocalDate類 98
4.2.3 更改器方法與訪問器方法 100
4.3 用戶自定義類 103
4.3.1 Employee類 103
4.3.2 多個源文件的使用 105
4.3.3 剖析Employee類 106
4.3.4 從構造器開始 106
4.3.5 隱式參數與顯式參數 108
4.3.6 封裝的優點 109
4.3.7 基於類的訪問權限 111
4.3.8 私有方法 111
4.3.9 final實例域 112
4.4 靜態域與靜態方法 112
4.4.1 靜態域 112
4.4.2 靜態常量 113
4.4.3 靜態方法 114
4.4.4 工廠方法 115
4.4.5 main方法 115
4.5 方法參數 118
4.6 對象構造 123
4.6.1 重載 123
4.6.2 默認域初始化 123
4.6.3 無參數的構造器 124
4.6.4 顯式域初始化 125
4.6.5 參數名 125
4.6.6 調用另一個構造器 126
4.6.7 初始化塊 127
4.6.8 對象析構與finalize方法 130
4.7 包 131
4.7.1 類的導入 131
4.7.2 靜態導入 133
4.7.3 將類放入包中 133
4.7.4 包作用域 136
4.8 類路徑 137
4.8.1 設置類路徑 139
4.9 文檔注釋 140
4.9.1 注釋的插入 140
4.9.2 類注釋 140
4.9.3 方法注釋 141
4.9.4 域注釋 142
4.9.5 通用注釋 142
4.9.6 包與概述注釋 143
4.9.7 注釋的抽取 143
4.10 類設計技巧 144
第5章 繼承 147
5.1 類、超類和子類 147
5.1.1 定義子類 147
5.1.2 覆蓋方法 149
5.1.3 子類構造器 150
5.1.4 繼承層次 153
5.1.5 多態 154
5.1.6 理解方法調用 155
5.1.7 阻止繼承:final類和方法 157
5.1.8 強製類型轉換 158
5.1.9 抽象類 160
5.1.10 受保護訪問 165
5.2 Object:所有類的超類 166
5.2.1 equals方法 166
5.2.2 相等測試與繼承 167
5.2.3 hashCode方法 170
5.2.4 toString方法 172
5.3 泛型數組列錶 178
5.3.1 訪問數組列錶元素 180
5.3.2 類型化與原始數組列錶的兼容性 183
5.4 對象包裝器與自動裝箱 184
5.5 參數數量可變的方法 187
5.6 枚舉類 188
5.7 反射 190
5.7.1 Class類 190
5.7.2 捕獲異常 192
5.7.3 利用反射分析類的能力 194
5.7.4 在運行時使用反射分析對象 198
5.7.5 使用反射編寫泛型數組代碼 202
5.7.6 調用任意方法 205
5.8 繼承的設計技巧 208
第6章 接口、lambda錶達式與內部類 211
6.1 接口 211
6.1.1 接口概念 211
6.1.2 接口的特性 217
6.1.3 接口與抽象類 218
6.1.4 靜態方法 218
6.1.5 默認方法 219
6.1.6 解決默認方法衝突 220
6.2 接口示例 222
6.2.1 接口與迴調 222
6.2.2 Comparator接口 224
6.2.3 對象剋隆 225
6.3 lambda錶達式 231
6.3.1 為什麼引入lambda錶達式 231
6.3.2 lambda錶達式的語法 232
6.3.3 函數式接口 234
6.3.4 方法引用 235
6.3.5 構造器引用 237
6.3.6 變量作用域 237
6.3.7 處理lambda錶達式 239
6.3.8 再談Comparator 242
6.4 內部類 242
6.4.1 使用內部類訪問對象狀態 244
6.4.2 內部類的特殊語法規則 247
6.4.3 內部類是否有用、必要和安全 248
6.4.4 局部內部類 250
6.4.5 由外部方法訪問變量 250
6.4.6 匿名內部類 252
6.4.7 靜態內部類 255
6.5 代理 258
6.5.1 何時使用代理 259
6.5.2 創建代理對象 259
6.5.3 代理類的特性 262
第7章 異常、斷言和日誌 264
7.1 處理錯誤 264
7.1.1 異常分類 265
7.1.2 聲明受查異常 267
7.1.3 如何拋齣異常 269
7.1.4 創建異常類 270
7.2 捕獲異常 271
7.2.1 捕獲異常 271
7.2.2 捕獲多個異常 273
7.2.3 再次拋齣異常與異常鏈 274
7.2.4 finally子句 275
7.2.5 帶資源的try語句 278
7.2.6 分析堆棧軌跡元素 280
7.3 使用異常機製的技巧 282
7.4 使用斷言 285
7.4.1 斷言的概念 285
7.4.2 啓用和禁用斷言 286
7.4.3 使用斷言完成參數檢查 287
7.4.4 為文檔假設使用斷言 288
7.5 記錄日誌 289
7.5.1 基本日誌 289
7.5.2 高級日誌 289
7.5.3 修改日誌管理器配置 291
7.5.4 本地化 292
7.5.5 處理器 293
7.5.6 過濾器 296
7.5.7 格式化器 296
7.5.8 日誌記錄說明 296
7.6 調試技巧 304
第8章 泛型程序設計 309
8.1 為什麼要使用泛型程序設計 309
8.1.1 類型參數的好處 309
8.1.2 誰想成為泛型程序員 310
8.2 定義簡單泛型類 311
8.3 泛型方法 313
8.4 類型變量的限定 314
8.5 泛型代碼和虛擬機 316
8.5.1 類型擦除 316
8.5.2 翻譯泛型錶達式 317
8.5.3 翻譯泛型方法 318
8.5.4 調用遺留代碼 319
8.6 約束與局限性 320
8.6.1 不能用基本類型實例化類型參數 320
8.6.2 運行時類型查詢隻適用於原始類型 321
8.6.3 不能創建參數化類型的數組 321
8.6.4 Varargs警告 322
8.6.5 不能實例化類型變量 323
8.6.6 不能構造泛型數組 323
8.6.7 泛型類的靜態上下文中類型變量無效 325
8.6.8 不能拋齣或捕獲泛型類的實例 325
8.6.9 可以消除對受查異常的檢查 326
8.6.10 注意擦除後的衝突 327
8.7 泛型類型的繼承規則 328
8.8 通配符類型 330
8.8.1 通配符概念 330
8.8.2 通配符的超類型限定 331
8.8.3 無限定通配符 334
8.8.4 通配符捕獲 334
8.9 反射和泛型 337
8.9.1 泛型Class類 337
8.9.2 使用Class參數進行類型匹配 338
8.9.3 虛擬機中的泛型類型信息 338
第9章 集閤 344
9.1 Java集閤框架 344
9.1.1 將集閤的接口與實現分離 344
9.1.2 Collection接口 346
9.1.3 迭代器 347
9.1.4 泛型實用方法 349
9.1.5 集閤框架中的接口 352
9.2 具體的集閤 353
9.2.1 鏈錶 355
9.2.2 數組列錶 362
9.2.3 散列集 363
9.2.4 樹集 366
9.2.5 隊列與雙端隊列 369
9.2.6 優先級隊列 371
9.3 映射 372
9.3.1 基本映射操作 372
9.3.2 更新映射項 375
9.3.3 映射視圖 376
9.3.4 弱散列映射 377
9.3.5 鏈接散列集與映射 378
9.3.6 枚舉集與映射 379
9.3.7 標識散列映射 380
9.4 視圖與包裝器 381
9.4.1 輕量級集閤包裝器 382
9.4.2 子範圍 382
9.4.3 不可修改的視圖 383
9.4.4 同步視圖 384
9.4.5 受查視圖 384
9.4.6 關於可選操作的說明 385
9.5 算法 388
9.5.1 排序與混排 389
9.5.2 二分查找 391
9.5.3 簡單算法 392
9.5.4 批操作 394
9.5.5 集閤與數組的轉換 394
9.5.6 編寫自己的算法 395
9.6 遺留的集閤 396
9.6.1 Hashtable類 397
9.6.2 枚舉 397
9.6.3 屬性映射 398
9.6.4 棧 399
9.6.5 位集 399
第10章 圖形程序設計 403
10.1 Swing概述 403
10.2 創建框架 407
10.3 框架定位 409
10.3.1 框架屬性 411
10.3.2 確定閤適的框架大小 411
10.4 在組件中顯示信息 415
10.5 處理2D圖形 419
10.6 使用顔色 426
10.7 文本使用特殊字體 429
10.8 顯示圖像 435
第11章 事件處理 439
11.1 事件處理基礎 439
11.1.1 實例:處理按鈕點擊事件 441
11.1.2 簡潔地指定監聽器 445
11.1.3 實例:改變觀感 447
11.1.4 適配器類 450
11.2 動作 453
11.3 鼠標事件 459
11.4 AWT事件繼承層次 465
11.4.1 語義事件和底層事件 466
第12章 Swing用戶界麵組件 469
12.1 Swing和模型–視圖–控製器設計模式 469
12.1.1 設計模式 469
12.1.2 模型–視圖–控製器模式 470
12.1.3 Swing按鈕的模型–視圖–控製器分析 473
12.2 布局管理概述 474
12.2.1 邊框布局 477
12.2.2 網格布局 478
12.3 文本輸入 481
12.3.1 文本域 482
12.3.2 標簽和標簽組件 483
12.3.3 密碼域 484
12.3.4 文本區 485
12.3.5 滾動窗格 485
12.4 選擇組件 488
12.4.1 復選框 488
12.4.2 單選鈕 490
12.4.3 邊框 493
12.4.4 組閤框 496
12.4.5 滑動條 499
12.5 菜單 504
12.5.1 菜單創建 504
12.5.2 菜單項中的圖標 507
12.5.3 復選框和單選鈕菜單項 508
12.5.4 彈齣菜單 508
12.5.5 快捷鍵和加速器 510
12.5.6 啓用和禁用菜單項 511
12.5.7 工具欄 515
12.5.8 工具提示 516
12.6 復雜的布局管理 518
12.6.1 網格組布局 520
12.6.2 組布局 528
12.6.3 不使用布局管理器 537
12.6.4 定製布局管理器 537
12.6.5 遍曆順序 541
12.7 對話框 541
12.7.1 選項對話框 542
12.7.2 創建對話框 551
12.7.3 數據交換 554
12.7.4 文件對話框 559
12.7.5 顔色選擇器 569
12.8 GUI程序排錯 573
12.8.1 調試技巧 573
12.8.2 讓AWT機器人完成工作 576
第13章 部署Java應用程序 580
13.1 JAR文件 580
13.1.1 創建JAR文件 580
13.1.2 清單文件 581
13.1.3 可執行JAR文件 582
13.1.4 資源 583
13.1.5 密封 585
13.2 應用首選項的存儲 586
13.2.1 屬性映射 586
13.2.2 首選項API 591
13.3 服務加載器 596
13.4 applet 598
13.4.1 一個簡單的applet 599
13.4.2 applet HTML標記和屬性 602
13.4.3 使用參數嚮applet傳遞信息 603
13.4.4 訪問圖像和音頻文件 608
13.4.5 applet上下文 609
13.4.6 applet間通信 609
13.4.7 在瀏覽器中顯示信息項 610
13.4.8 沙箱 611
13.4.9 簽名代碼 612
13.5 Java Web Start 614
13.5.1 發布Java Web Start應用 614
13.5.2 JNLP API 617
第14章 並發 624
14.1 什麼是綫程 624
14.1.1 使用綫程給其他任務提供機會 629
14.2 中斷綫程 632
14.3 綫程狀態 635
14.3.1 新創建綫程 635
14.3.2 可運行綫程 635
14.3.3 被阻塞綫程和等待綫程 636
14.3.4 被終止的綫程 636
14.4 綫程屬性 638
14.4.1 綫程優先級 638
14.4.2 守護綫程 639
14.4.3 未捕獲異常處理器 639
14.5 同步 640
14.5.1 競爭條件的一個例子 641
14.5.2 競爭條件詳解 644
14.5.3 鎖對象 646
14.5.4 條件對象 648
14.5.5 synchronized關鍵字 653
14.5.6 同步阻塞 656
14.5.7 監視器概念 657
14.5.8 Volatile域 658
14.5.9 final變量 659
14.5.10 原子性 659
14.5.11 死鎖 661
14.5.12 綫程局部變量 663
14.5.13 鎖測試與超時 665
14.5.14 讀/寫鎖 666
14.5.15 為什麼棄用stop和suspend方法 667
14.6 阻塞隊列 668
14.7 綫程安全的集閤 673
14.7.1 高效的映射、集和隊列 674
14.7.2 映射條目的原子更新 675
14.7.3 對並發散列映射的批操作 676
14.7.4 並發集視圖 678
14.7.5 寫數組的拷貝 679
14.7.6 並行數組算法 679
14.7.7 較早的綫程安全集閤 680
14.8 Callable與Future 681
14.9 執行器 685
14.9.1 綫程池 685
14.9.2 預定執行 689
14.9.3 控製任務組 690
14.9.4 Fork-Join框架 691
14.9.5 可完成Future 694
14.10 同步器 696
14.10.1 信號量 696
14.10.2 倒計時門栓 697
14.10.3 障柵 697
14.10.4 交換器 698
14.10.5 同步隊列 698
14.11 綫程與Swing 698
14.11.1 運行耗時的任務 699
14.11.2 使用Swing工作綫程 703
14.11.3 單一綫程規則 708
附錄A Java關鍵字 710
· · · · · · (
收起)