內容簡介
本書採用由淺入深、與實際套用緊密結合的方式,利用大量經典實用的實例,詳細講解Java面向對象的編程思想、編程語法和設計模式,介紹常見Java類庫的用法,總結最佳化Java編程的各種寶貴經驗,深入闡述Java虛擬機執行Java程式的原理。本書的實例都基於最新的JDK8版本。本書的最大特色是以6條主線貫穿書:面向對象編程思想、Java語言的語法、Java虛擬機執行Java程式的原理、在實際項目中的運用、設計模式和性能最佳化技巧。另外,本書還貫穿了Oracle公司的OCJP(Oracle Certified Java Programmer)認證的考試要點。
作者簡介
孫衛琴,知名IT作家和Java專家,畢業於上海交通大學,隨後主要從事基於Java的軟體開發工作,在此其間還從事Java方面的培訓和諮詢工作。
目錄
第1章面向對象開發方法概述 1
1.1 結構化的軟體開發方法簡介 3
1.2 面向對象的軟體開發方法簡介 6
1.2.1 對象模型 6
1.2.2 UML:可視化建模語言 7
1.2.3 Rational Rose:可視化建模
工具 7
1.3 面向對象開發中的核心思想
和概念 8
1.3.1 問題領域、對象、屬性、狀態、行為、方法、實現 8
1.3.2 類、類型 10
1.3.3 訊息、服務 12
1.3.4 接口 13
1.3.5 封裝、透明 14
1.3.6 抽象 18
1.3.7 繼承、擴展、覆蓋 20
1.3.8 組合 21
1.3.9 多態、動態綁定 24
1.4 UML語言簡介 26
1.4.1 用例圖 27
1.4.2 類框圖 28
1.4.3 時序圖 29
1.4.4 協作圖 30
1.4.5 狀態轉換圖 30
1.4.6 組件圖 31
1.4.7 部署圖 32
1.5 類之間的關係 32
1.5.1 關聯(Association) 33
1.5.2 依賴(Dependency) 34
1.5.3 聚集(Aggregation) 35
1.5.4 泛化(Generalization) 36
1.5.5 實現(Realization) 36
1.5.6 區分依賴、關聯和聚集關係 36
1.6 實現Panel系統 39
1.6.1 擴展Panel系統 42
1.6.2 用配置檔案進一步提高Panel
系統的可維護性 43
1.6.3 運行Panel系統 45
1.7 小結 45
1.8 思考題 46
第2章第一個Java套用 47
2.1 創建Java源檔案 47
2.1.1 Java源檔案結構 49
2.1.2 包聲明語句 49
2.1.3 包引入語句 51
2.1.4 方法的聲明 53
2.1.5 程式入口main()方法的聲明 54
2.1.6 給main()方法傳遞參數 55
2.1.7 注釋語句 55
2.1.8 關鍵字 56
2.1.9 標識符 56
2.1.10 編程規範 57
2.2 用JDK管理Java套用 57
2.2.1 JDK簡介以及安裝方法 58
2.2.2 編譯Java源檔案 60
2.2.3 運行Java程式 62
2.2.4 給Java套用打包 65
2.3 使用和創建JavaDoc文檔 66
2.3.1 JavaDoc標記 68
2.3.2 javadoc命令的用法 73
2.4 Java虛擬機運行Java程式的
基本原理 75
2.5 小結 77
2.6 思考題 78
第3章數據類型和變數 81
3.1 基本數據類型 82
3.1.1 boolean類型 82
3.1.2 byte、short、int和long
類型 83
3.1.3 char類型與字元編碼 85
3.1.4 float和double類型 87
3.2 引用類型 91
3.2.1 基本類型與引用類型的區別 92
3.2.2 用new關鍵字創建對象 94
3.3 變數的作用域 95
3.3.1 實例變數和靜態變數的
生命周期 97
3.3.2 局部變數的生命周期 100
3.3.3 成員變數和局部變數同名 101
3.3.4 將局部變數的作用域
最小化 102
3.4 對象的默認引用:this 103
3.5 參數傳遞 105
3.6 變數的初始化以及默認值 107
3.6.1 成員變數的初始化 107
3.6.2 局部變數的初始化 108
3.7 直接數 109
3.7.1 直接數的類型 110
3.7.2 直接數的賦值 111
3.8 小結 112
3.9 思考題 113
第4章操作符 115
4.1 操作符簡介 115
4.2 整型操作符 116
4.2.1 一元整型操作符 117
4.2.2 二元整型操作符 118
4.3 浮點型操作符 123
4.4 比較操作符和邏輯操作符 124
4.5 特殊操作符“?:” 127
4.6 字元串連線操作符“+” 127
4.7 操作符“==”與對象的
equals()方法 129
4.7.1 操作符“==” 129
4.7.2 對象的equals()方法 130
4.8 instanceof操作符 133
4.9 變數的賦值和類型轉換 135
4.9.1 基本數據類型轉換 136
4.9.2 引用類型的類型轉換 139
4.10 小結 139
4.11 思考題 142
第5章流程控制 145
5.1 分支語句 146
5.1.1 if else語句 146
5.1.2 switch語句 150
5.2 循環語句 154
5.2.1 while語句 154
5.2.2 do while語句 156
5.2.3 for語句 158
5.2.4 foreach語句 161
5.2.5 多重循環 162
5.3 流程跳轉語句 162
5.4 綜合例子:八皇后問題 165
5.5 小結 168
5.6 思考題 169
第6章繼承 173
6.1 繼承的基本語法 173
6.2 方法重載(Overload) 175
6.3 方法覆蓋(Override) 177
6.4 方法覆蓋與方法重載的
異同 183
6.5 super關鍵字 183
6.6 多態 185
6.7 繼承的利弊和使用原則 189
6.7.1 繼承樹的層次不可太多 190
6.7.2 繼承樹的上層為抽象層 190
6.7.3 繼承關係最大的弱點:
打破封裝 191
6.7.4 精心設計專門用於被繼承
的類 193
6.7.5 區分對象的屬性與繼承 195
6.8 比較組合與繼承 197
6.8.1 組合關係的分解過程對應
繼承關係的抽象過程 197
6.8.2 組合關係的組合過程對應
繼承關係的擴展過程 200
6.9 小結 203
6.10 思考題 204
第7章 Java語言中的修飾符 209
7.1 訪問控制修飾符 210
7.2 abstract修飾符 212
7.3 final修飾符 214
7.3.1 final類 215
7.3.2 final方法 215
7.3.3 final變數 216
7.4 static修飾符 220
7.4.1 static變數 220
7.4.2 static方法 223
7.4.3 static代碼塊 226
7.4.4 用static進行靜態導入 228
7.5 小結 228
7.6 思考題 230
第8章接口 233
8.1 接口的概念和基本特徵 234
8.2 比較抽象類與接口 237
8.3 與接口相關的設計模式 241
8.3.1 定製服務模式 241
8.3.2 適配器模式 245
8.3.3 默認適配器模式 250
8.3.4 代理模式 251
8.3.5 標識類型模式 256
8.3.6 常量接口模式 257
8.4 小結 258
8.5 思考題 259
第9章異常處理 261
9.1 Java異常處理機制概述 262
9.1.1 Java異常處理機制的優點 262
9.1.2 Java虛擬機的方法調用棧 264
9.1.3 異常處理對性能的影響 267
9.2 運用Java異常處理機制 267
9.2.1 try-catch語句:捕獲異常 267
9.2.2 finally語句:任何情況下
必須執行的代碼 268
9.2.3 throws子句:聲明可能會
出現的異常 270
9.2.4 throw語句:拋出異常 271
9.2.5 異常處理語句的語法規則 271
9.2.6 異常流程的運行過程 274
9.2.7 跟蹤丟失的異常 278
9.3 Java異常類 280
9.3.1 運行時異常 282
9.3.2 受檢查異常
(Checked Exception) 282
9.3.3 區分運行時異常和受
檢查異常 283
9.4 用戶定義異常 285
9.4.1 異常轉譯和異常鏈 285
9.4.2 處理多樣化異常 288
9.5 異常處理原則 289
9.5.1 異常只能用於非正常情況 290
9.5.2 為異常提供說明文檔 290
9.5.3 儘可能地避免異常 291
9.5.4 保持異常的原子性 292
9.5.5 避免過於龐大的try代碼塊 294
9.5.6 在catch子句中指定具體的
異常類型 294
9.5.7 不要在catch代碼塊中忽略
被捕獲的異常 294
9.6 記錄日誌 295
9.6.1 創建Logger對象及設定
日誌級別 296
9.6.2 生成日誌 297
9.6.3 把日誌輸出到檔案 297
9.6.4 設定日誌的輸出格式 298
9.7 使用斷言 299
9.8 小結 300
9.9 思考題 301
第10章類的生命周期 305
10.1 Java虛擬機及程式的
生命周期 305
10.2 類的載入、連線和初始化 305
10.2.1 類的載入 306
10.2.2 類的驗證 307
10.2.3 類的準備 307
10.2.4 類的解析 308
10.2.5 類的初始化 308
10.2.6 類的初始化的時機 310
10.3 類載入器 313
10.3.1 類載入的父親委託機制 315
10.3.2 創建用戶自定義的類
載入器 317
10.3.3 URLClassLoader類 323
10.4 類的卸載 324
10.5 小結 325
10.6 思考題 326
第11章對象的生命周期 327
11.1 創建對象的方式 327
11.2 構造方法 330
11.2.1 重載構造方法 331
11.2.2 默認構造方法 332
11.2.3 子類調用父類的構造方法 333
11.2.4 構造方法的作用域 337
11.2.5 構造方法的訪問級別 337
11.3 靜態工廠方法 338
11.3.1 單例類 340
11.3.2 枚舉類 342
11.3.3 不可變(immutable)類與
可變類 344
11.3.4 具有實例快取的
不可變類 348
11.3.5 松耦合的系統接口 350
11.4 垃圾回收 351
11.4.1 對象的可觸及性 352
11.4.2 垃圾回收的時間 354
11.4.3 對象的finalize()方法簡介 354
11.4.4 對象的finalize()方法的
特點 355
11.4.5 比較finalize()方法和finally
代碼塊 357
11.5 清除過期的對象引用 358
11.6 對象的強、軟、弱和
虛引用 360
11.7 小結 366
11.8 思考題 367
第12章內部類 371
12.1 內部類的基本語法 371
12.1.1 實例內部類 373
12.1.2 靜態內部類 376
12.1.3 局部內部類 377
12.2 內部類的繼承 379
12.3 子類與父類中的內部類
同名 380
12.4 匿名類 381
12.5 內部接口以及接口中的
內部類 384
12.6 內部類的用途 385
12.6.1 封裝類型 385
12.6.2 直接訪問外部類的成員 385
12.6.3 回調 386
12.7 內部類的類檔案 388
12.8 小結 389
12.9 思考題 389
第13章多執行緒 393
13.1 Java執行緒的運行機制 393
13.2 執行緒的創建和啟動 395
13.2.1 擴展java.lang.Thread類 395
13.2.2 實現Runnable接口 400
13.3 執行緒的狀態轉換 402
13.3.1 新建狀態 402
13.3.2 就緒狀態 402
13.3.3 運行狀態 402
13.3.4 阻塞狀態 403
13.3.5 死亡狀態 404
13.4 執行緒調度 405
13.4.1 調整各個執行緒的優先權 406
13.4.2 執行緒睡眠:Thread.sleep()
方法 408
13.4.3 執行緒讓步:
Thead.yield()方法 409
13.4.4 等待其他執行緒結束:join() 410
13.5 獲得當前執行緒對象的引用 411
13.6 後台執行緒 412
13.7 定時器 413
13.8 執行緒的同步 415
13.8.1 同步代碼塊 418
13.8.2 執行緒同步的特徵 422
13.8.3 同步與並發 425
13.8.4 執行緒安全的類 426
13.8.5 釋放對象的鎖 427
13.8.6 死鎖 429
13.9 執行緒通信 430
13.10 中斷阻塞 435
13.11 執行緒控制 436
13.11.1 被廢棄的suspend()和
resume()方法 437
13.11.2 被廢棄的stop()方法 438
13.11.3 以編程的方式控制執行緒 438
13.12 執行緒組 440
13.13 處理執行緒未捕獲的異常 441
13.14 ThreadLocal類 443
13.15 concurrent並發包 445
13.15.1 用於執行緒同步的Lock
外部鎖 446
13.15.2 用於執行緒通信的Condition
條件接口 447
13.15.3 支持異步計算的Callable
接口和Future接口 450
13.15.4 通過執行緒池來高效管理
多個執行緒 452
13.15.5 BlockingQueue阻塞佇列 454
13.16 小結 457
13.17 思考題 458
第14章數組 461
14.1 數組變數的聲明 461
14.2 創建數組對象 462
14.3 訪問數組的元素和長度 463
14.4 數組的初始化 465
14.5 多維數組以及不規則數組 465
14.6 調用數組對象的方法 467
14.7 把數組作為方法參數或
返回值 467
14.8 數組排序 470
14.9 數組的二分查找算法 471
14.10 哈希表 472
14.11 數組實用類:Arrays 477
14.12 用符號“…”聲明數目
可變參數 480
14.13 小結 481
14.14 思考題 481
第15章 Java集合 485
15.1 Collection和Iterator接口 486
15.2 集合中直接加入基本類型
數據 489
15.3 Set(集) 490
15.3.1 Set的一般用法 490
15.3.2 HashSet類 491
15.3.3 TreeSet類 493
15.4 List(列表) 497
15.4.1 訪問列表的元素 498
15.4.2 為列表排序 498
15.4.3 ListIterator接口 499
15.4.4 獲得固定長度的
List對象 500
15.4.5 比較Java數組和各種List
的性能 500
15.5 Queue(佇列) 503
15.5.1 Deque(雙向佇列) 504
15.5.2 PriorityQueue
(優先權佇列) 505
15.6 Map(映射) 505
15.7 HashSet和HashMap的
負載因子 507
15.8 集合實用類:Collections 508
15.9 執行緒安全的集合 510
15.10 集合與數組的互換 511
15.11 集合的批量操作 512
15.12 歷史集合類 513
15.13 枚舉類型 517
15.13.1 枚舉類型的構造方法 519
15.13.2 EnumSet類和
EnumMap類 520
15.14 小結 521
15.15 思考題 521
第16章泛型 523
16.1 Java集合的泛型 523
16.2 定義泛型類和泛型接口 524
16.3 用extends關鍵字限定
類型參數 526
16.4 定義泛型數組 527
16.5 定義泛型方法 528
16.6 使用“?”通配符 529
16.7 使用泛型的注意事項 530
16.8 小結 531
16.9 思考題 531
第17章 Lambda表達式 533
17.1 Lambda表達式的基本用法 533
17.2 用Lambda表達式代替
內部類 534
17.3 Lambda表達式和集合的
forEach()方法 535
17.4 用Lambda表達式對集合
進行排序 536
17.5 Lambda表達式與
Stream API聯合使用 537
17.6 Lambda表達式可操縱的
變數作用域 539
17.7 Lambda表達式中的方法
引用 540
17.8 函式式接口
(FunctionalInterface) 541
17.9 總結Java語法糖 541
17.10 小結 542
17.11 思考題 542
第18章輸入與輸出(I/O) 545
18.1 輸入流和輸出流概述 546
18.2 輸入流 547
18.2.1 位元組數組輸入流:
ByteArrayInputStream類 548
18.2.2 檔案輸入流:
FileInputStream類 549
18.2.3 管道輸入流:
PipedInputStream 551
18.2.4 順序輸入流:
SequenceInputStream類 552
18.3 過濾輸入流:
FilterInputStream 552
18.3.1 裝飾器設計模式 553
18.3.2 過濾輸入流的種類 554
18.3.3 DataInputStream類 555
18.3.4 BufferedInputStream類 556
18.3.5 PushbackInputStream類 557
18.4 輸出流 557
18.4.1 位元組數組輸出流:
ByteArrayOutputStream類 557
18.4.2 檔案輸出流:
FileOutputStream 558
18.5 過濾輸出流:
FilterOutputStream 559
18.5.1 DataOutputStream 559
18.5.2 BufferedOutputStream 559
18.5.3 PrintStream類 561
18.6 Reader/Writer概述 563
18.7 Reader類 565
18.7.1 字元數組輸入流:
CharArrayReader類 566
18.7.2 字元串輸入流:
StringReader類 566
18.7.3 InputStreamReader類 567
18.7.4 FileReader類 568
18.7.5 BufferedReader類 568
18.8 Writer類 568
18.8.1 字元數組輸出流:
CharArrayWriter類 569
18.8.2 OutputStreamWriter類 570
18.8.3 FileWriter類 572
18.8.4 BufferedWriter類 573
18.8.5 PrintWriter類 573
18.9 標準I/O 574
18.9.1 重新包裝標準輸入和輸出 574
18.9.2 標準I/O重定向 575
18.10 隨機訪問檔案類:
RandomAccessFile 576
18.11 新I/O類庫 577
18.11.1 緩衝器Buffer概述 578
18.11.2 通道Channel概述 579
18.11.3 字元編碼Charset類概述 581
18.11.4 用FileChannel讀寫檔案 581
18.11.5 控制緩衝區 582
18.11.6 字元編碼轉換 583
18.11.7 緩衝區視圖 584
18.11.8 檔案映射緩衝區:
MappedByteBuffer 586
18.11.9 檔案加鎖 587
18.12 對象的序列化與反序列化 589
18.13 自動釋放資源 595
18.14 用File類來查看、創建和
刪除檔案或目錄 596
18.15 用java.nio.file類庫來操作
檔案系統 599
18.15.1 複製、移動檔案以及遍歷、
過濾目錄樹 600
18.15.2 查看ZIP壓縮檔案 601
18.16 小結 602
18.17 思考題 603
第19章圖形用戶界面 605
19.1 AWT組件和Swing組件 605
19.2創建圖形用戶界面的
基本步驟 608
19.3布局管理器 610
19.3.1 FlowLayout(流式布局
管理器) 611
19.3.2 BorderLayout(邊界布局
管理器) 613
19.3.3 GridLayout(格線布局
管理器) 616
19.3.4 CardLayout(卡片布局
管理器) 619
19.3.5 GridBagLayout(格線包
布局管理器) 620
19.4事件處理 626
19.4.1 事件處理的軟體實現 626
19.4.2 事件源﹑事件和監聽器
的類層次和關係 632
19.5 AWT繪圖 637
19.5.1 Graphics類 639
19.5.2 Graphics2D類 644
19.6 AWT執行緒(事件分派
執行緒) 647
19.7小結 649
19.8思考題 650
第20章常用Swing組件 653
20.1 框線(Border) 653
20.2 按鈕組件(AbstractButton)
及子類 654
20.3 文本框(JTextField) 657
20.4 文本區域(JTextArea)與
滾動面板(JScrollPane) 660
20.5 複選框(JCheckBox)與單選
按鈕(JRadioButton) 661
20.6 下拉列表(JComboBox) 664
20.7 列表框(JList) 665
20.8 頁簽面板(JTabbedPane) 667
20.9 選單(JMenu) 669
20.10 對話框(JDialog) 674
20.11 檔案對話框
(JFileChoose) 676
20.12 訊息框 679
20.13 製作動畫 681
20.14 播放音頻檔案 683
20.15 BoxLayout布局管理器 686
20.16 設定Swing界面的外觀
和感覺 689
20.17 小結 691
20.18 思考題 692
第21章 Java常用類 693
21.1 Object類 693
21.2 String類和StringBuffer類 694
21.2.1 String類 694
21.2.2 “hello”與new String(“hello”)
的區別 697
21.2.3 StringBuffer類 698
21.2.4 比較String類與
StringBuffer類 699
21.2.5 正則表達式 701
21.2.6 格式化字元串 703
21.3 包裝類 707
21.3.1 包裝類的構造方法 707
21.3.2 包裝類的常用方法 708
21.3.3 包裝類的自動裝箱和拆箱 709
21.4 Math類 710
21.5 Random類 712
21.6 傳統的處理日期/時間的類 712
21.6.1 Date類 713
21.6.2 DateFormat類 713
21.6.3 Calendar類 715
21.7 新的處理日期/時間的類 716
21.7.1 LocalDate類 717
21.7.2 LocalTime類 718
21.7.3 LocalDateTime類 718
21.8 BigInteger類 719
21.9 BigDecimal類 720
21.10 用Optional類避免空指針
異常 722
21.11 小結 724
21.12 思考題 725
第22章 Annotation註解 727
22.1 自定義Annotation註解
類型 727
22.2 在類的原始碼中引用
註解類型 730
22.3 在程式中運用反射機制讀取
類的註解信息 732
22.4 基本內置註解 735
22.5 小結 736
22.6 思考題 736