便于學習的設計
● 關鍵技能與概念:每章開頭列出要介紹的技能和概念
● 專家解答:以問答形式提供附加信息和實用提示
● 編程練習:示范如何運用編程技能的緊貼實用的練習
● 自測題:每章末尾都有一些測試題,以幫助讀者扎實掌握Java技能
● 語法注釋:示例代碼中的注釋闡述正在演示的編程技巧
《Java 11官方入門教程(第8版)》針對Java SE 11做了全面細致的更新。
《Java 11官方入門教程(第8版)》由全球著名的暢銷書編程作家Herbert Schildt執(zhí)筆,指導你立即著手編寫Java程序。本書開篇講解基礎知識,分析如何創(chuàng)建、編譯和運行Java程序;接著濃墨重彩地描述構成Java語言核心的關鍵字、語法和結構;*后講述Java的一些高級特性,包括多線程編程、泛型、lambda表達式、模塊、Swing以及Java交互編程工具JShell。本書通俗易懂、簡明扼要、詳略得當,成為全球數(shù)百萬讀者的理想選擇。
《Java 11官方入門教程(第8版)》旨在幫助你學習Java程序設計的基礎知識,采用循序漸進的教學方法,安排了許多示例、自測題和編程練習!禞ava 11官方入門教程(第8版)》不需要讀者具備編程經(jīng)驗,而是從最基礎的知識,從如何編譯并運行Java程序開始講起。然后討論構成Java語言核心的關鍵字、功能和結構。還介紹Java的一些最重要高級功能,如多線程編程、泛型、lambda表達式和模塊。此外,《Java 11官方入門教程(第8版)》還介紹Swing基礎。學完《Java 11官方入門教程(第8版)》后,讀者將牢固掌握Java編程精髓。
值得說明的是,《Java 11官方入門教程(第8版)》只是學習Java的起點。Java不僅是一些定義語言的元素,還包括擴展的庫和工具來幫助開發(fā)程序。要想成為頂尖的Java程序員,就必須掌握這些知識。讀者在學完《Java 11官方入門教程(第8版)》后,就有了足夠的知識來繼續(xù)學習Java的其他方面。
0.1 Java的發(fā)展歷程
只有少數(shù)幾種編程語言對程序設計帶來過根本性影響。其中,Java的影響由于迅速和廣泛而格外突出?梢院敛豢鋸埖卣f,1995年Sun公司發(fā)布的Java 1.0給計算機程序設計領域帶來了一場變革。這場變革迅速將Web轉變成一個高度交互的環(huán)境,也給計算機語言的設計設置了一個新標準。
多年來,Java不斷發(fā)展、演化和修訂。和其他語言加入新功能的動作遲緩不同,Java一直站在計算機程序設計語言的前沿,部分原因是其不斷變革的文化,部分原因是它所面對的變化。Java已經(jīng)做過或大或小的多次升級。
第一次主要升級是Java 1.1版,這次升級比較大,加入了很多新的庫元素,修訂了處理事件的方式,重新配置了1.0版本的庫中的許多功能。
第二個主要版本是Java 2,它代表Java的第二代,標志著Java現(xiàn)代化的到來。Java 2第一個發(fā)布的版本號是1.2。Java 2在第一次發(fā)布時使用1.2版本號看上去有些奇怪。原因在于,該號碼最初指Java庫的內(nèi)部版本號,后來就泛指整個版本號了。Java 2被Sun重新包裝為J2SE(Java 2 Platform Standard Edition),并且開始把版本號應用于該產(chǎn)品。
Java的下一次升級是J2SE 1.3,它是Java 2版本首次較大的升級。它增強了已有的功能,精簡了開發(fā)環(huán)境。J2SE 1.4進一步增強了Java。該版本包括一些重要的新功能,如鏈式異常、基于通道的I/O以及assert關鍵字。
Java的下一版本是J2SE 5,它是Java的第二次變革。以前的幾次Java升級提供的改進雖然重要,但都是增量式的,而J2SE 5卻從該語言的作用域、功能和范圍等方面提供了根本性改進。為幫助理解J2SE 5的修改程度,下面列出了J2SE 5中的一些主要新功能:
● 泛型
● 自動裝箱/自動拆箱
● 枚舉
● 增強型for循環(huán)(for-each)
● 可變長度實參(varargs)
● 靜態(tài)導入
● 注解(annotation)
這些條目都是重要升級,每個條目都代表了Java語言的一處重要改進。其中,泛型、增強型for循環(huán)和可變長度實參引入了新的語法元素;自動裝箱和自動拆箱修改了語法規(guī)則;注解增加了一種全新的編程注釋方法。
這些新功能的重要性反映在使用的版本號5上。從版本號的變化方式看,這一版本的Java應該是1.5。由于新功能和變革如此之多,常規(guī)的版本號升級(從1.4到1.5)已無法標識變化的幅度,因此Sun決定使用版本號5,以強調(diào)發(fā)生了重要改進。因此將這個版本稱為J2SE 5,將開發(fā)工具包稱為JDK 5。但是,為了保持和以前的一致性,Sun決定使用1.5作為內(nèi)部版本號,也稱為開發(fā)版本號。J2SE 5中的5稱為產(chǎn)品版本號。
之后發(fā)布的Java版本是Java SE 6,Sun再次決定修改Java平臺的名稱,把2從版本號中刪除了。Java平臺現(xiàn)在的名稱是Java SE,官方產(chǎn)品名稱是Java Platform Standard Edition 6,對應的Java開發(fā)工具包稱為JDK 6。和J2SE 5一樣,Java SE 6中的6是指產(chǎn)品的版本號,內(nèi)部的開發(fā)版本號是1.6。
Java SE 6 建立在J2SE 5的基礎之上,做了進一步的增強和改進。Java SE 6并沒有對Java語言本身添加較大的功能,而是增強了API庫,添加了多個新包,改進了運行時環(huán)境。它在漫長的生命周期(Java術語)內(nèi)經(jīng)歷了一些更新,添加了一些升級功能?傊琂ava SE 6進一步鞏固了J2SE 5建立的領先地位。
接下來的版本是Java SE 7,對應的Java開發(fā)工具包稱為JDK 7,內(nèi)部版本號是1.7。Java SE 7是Oracle收購Sun Microsystems之后發(fā)布的第一個主版本。Java SE 7包含許多新功能,對語言和API庫做了許多增強。Java SE 7添加的最重要功能是在Project Coin中開發(fā)的那些功能。Project Coin的目的是確保把對Java語言所做的很多小改動包含到JDK 7中,其中包括:
● 現(xiàn)在String可控制switch語句。
● 二進制整型字面值。
● 在數(shù)值字面值中使用下畫線。
● 新增一種稱為try-with-resources的try語句,支持自動資源管理。
● 構造泛型實例時,通過菱形運算符使用類型推斷。
● 增強了異常處理,可以使用單個catch捕獲兩個或更多個異常(多重捕獲),并且可以對重新拋出的異常進行更好的類型檢查。
可以看到,雖然Project Coin中的功能被視為小改動,但是小這個詞實在不能體現(xiàn)它們所帶來的好處。特別是,try-with-resources語句會對大量代碼的編寫方式產(chǎn)生深遠影響。
此后的版本是Java SE 8,對應的開發(fā)工具包是JDK 8,內(nèi)部的開發(fā)版本號是1.8。JDK 8表示這是對Java語言的一次重大升級,因為本次升級包含了一種意義深遠的新語言功能:lambda表達式。lambda表達式不但改變了概念化的編程方式,而且改變了Java代碼的編寫方式。使用lambda表達式,可以簡化并減少創(chuàng)建某個結構所需的源代碼量。另外,使用lambda表達式還可將新的運算符-> 和一種新的語法元素引入Java語言中。
除了lambda表達式,JDK 8中還新增了其他一些重要功能。例如,從JDK 8開始,通過接口可以為指定的方法定義默認實現(xiàn)?傊,Java SE 8擴展了Java語言的功能,并且改變了Java代碼的編寫方式,帶來的影響足夠深遠。
再后的Java版本是Java SE 9,對應的開發(fā)工具包是JDK 9。JDK 9表示這是對Java語言的一次重大升級,合并了對Java語言及其庫的重大改進。主要的新功能是模塊,它允許指定構成應用程序的代碼之間的關系和依賴。模塊還給Java的訪問控制功能添加了另一種方式。包括模塊導致一個新的語法元素、幾個新的關鍵字和各種工具改進被添加到Java中。模塊還對API庫具有深遠的影響,因為從JDK 9開始,庫包現(xiàn)在組織為模塊。
除了模塊之外,JDK 9還包括幾個新功能。其中一個特別有趣的是JShell,它是一個支持交互式程序體驗和學習的工具(有關Jshell的簡介,見附錄D)。另一個有趣的升級是支持私有接口方法。包含它們進一步增強了JDK 8對接口中默認方法的支持。JDK 9給javadoc工具添加了搜索功能,還添加了一個新的標記@index來支持它。與以前的版本一樣,JDK 9包含對Java API庫的許多更新和改進。
作為一般規(guī)則,在任何Java版本中,都有令人矚目的新功能。但JDK 9廢棄了Java高度配置的一個方面:applet。從JDK 9開始,applet不再推薦在新項目中使用。如第1章所述,因為applet需要瀏覽器支持以及其他一些因素,JDK 9廢棄了整個applet API。
Java的下一個版本是Java SE 10 (JDK 10)。然而,在發(fā)布它之前,Java發(fā)布計劃發(fā)生了重大變化。過去,主要發(fā)行版通常間隔兩年或更長時間。然而,從JDK 10開始,發(fā)行版之間的時間明顯縮短了,F(xiàn)在預計發(fā)布將嚴格按照基于時間的計劃表進行,主要發(fā)布版本(現(xiàn)在稱為功能發(fā)布版本)之間的預期時間只有6個月。因此,JDK 10于2018年3月發(fā)布,也就是JDK 9發(fā)布6個月之后。這種更快的發(fā)布節(jié)奏使Java程序員能夠快速獲得新特性和改進。當一個新特性準備好時,它將成為下一個預定發(fā)行版的一部分,而不是等待兩年或更長時間。
JDK 10增加的主要新語言特性是支持本地變量類型推斷。有了局部變量類型推斷,現(xiàn)在可以在初始化器的類型中推斷局部變量的類型,而不是顯式指定其類型。為了支持這個新功能,將上下文敏感的標識符var添加到Java中,作為保留類型名。類型推斷可以簡化代碼,因為如果可以從初始化器中推斷變量的類型,就不需要指定多余的變量類型。在難以識別類型或無法顯式指定類型的情況下,它還可以簡化聲明。局部變量類型推斷已經(jīng)成為當代編程環(huán)境的一個常見部分。它包含在Java中,幫助Java跟上語言設計不斷發(fā)展的趨勢。除了其他一些更改外,JDK 10還重新定義了Java版本字符串,更改了版本號的含義,以便更好地與新的基于時間的發(fā)布計劃保持一致。
在撰寫《Java 11官方入門教程(第8版)》時,Java的最新版本是Java SE 11 (JDK 11)。它于2018年9月發(fā)布,比JDK 10晚了6個月。JDK 11中主要的新語言特性是支持在lambda表達式中使用var。此外,還向Java啟動程序添加了另一種執(zhí)行模式,使其能夠直接執(zhí)行簡單的單文件程序。JDK 11還刪除了一些特性。也許最有趣的是取消對applet的支持,這是因為applet的歷史意義。回顧一下,applet最初是由JDK 9禁用的。隨著JDK 11的發(fā)布,applet支持已經(jīng)被移除。JDK 11還刪除了對另一種與部署相關的技術Java Web Start的支持。JDK 11中還有一個引人注目的刪除:JavaFX;這個GUI框架不再是JDK的一部分,而是成為一個獨立的開源項目。因為JDK已經(jīng)刪除了這些特性,所以《Java 11官方入門教程(第8版)》不討論它們。
關于Java演化的另一要點是:從2006年開始,Java的開源過程就開始了。今天,JDK的開源實現(xiàn)是可用的。開源進一步促進了Java開發(fā)的動態(tài)性。歸根結底,Java的創(chuàng)新是安全的。Java仍然是編程界所期待的充滿活力、靈活的語言。
《Java 11官方入門教程(第8版)》中的內(nèi)容已通過JDK 11更新。然而,如前所述,Java編程的歷史是以動態(tài)變化為標志的。隨著對Java的學習不斷深入,用戶將希望查看后續(xù)Java發(fā)行版的每個新特性。簡單地說:Java的演化還在繼續(xù)!
0.3 《Java 11官方入門教程(第8版)》的組織結構
《Java 11官方入門教程(第8版)》采用教程式的組織結構,每一章都建立在前面的基礎之上!禞ava 11官方入門教程(第8版)》共分16章,每一章討論Java的一個方面。《Java 11官方入門教程(第8版)》的特色就在于包含許多便于讀者學習的特色內(nèi)容。
● 關鍵技能與概念:每一章首先介紹一些該章中要介紹的重要技能。
● 自測題:每一章都有自測題,測試讀者學習到的知識。答案在附錄A中提供。
● 專家解答:每一章中都穿插一些專家解答,以一問一答的形式介紹補充知識和要點。
● 編程練習:每一章中都包含一兩道編程練習,以幫助讀者將學到的知識應用到實踐中。很多這樣的練習都是實際的示例,讀者可以將其用作自己的程序的起點。
0.4 《Java 11官方入門教程(第8版)》不需要讀者具有編程經(jīng)驗
《Java 11官方入門教程(第8版)》假定讀者沒有任何編程經(jīng)驗。如果讀者沒有編程經(jīng)驗,閱讀《Java 11官方入門教程(第8版)》是正確的選擇。如果讀者有一些編程經(jīng)驗,在閱讀《Java 11官方入門教程(第8版)》時可以加快速度。但要記住,Java在幾個重要的地方與其他一些流行的計算機語言不同,所以不要急于下結論。因此,即使讀者是經(jīng)驗豐富的程序員,也仍然建議仔細閱讀《Java 11官方入門教程(第8版)》。
0.5 《Java 11官方入門教程(第8版)》需要的軟件環(huán)境
要編譯和運行《Java 11官方入門教程(第8版)》提供的所有程序,需要獲得最新版本的Java Development Kit (JDK)。在撰寫《Java 11官方入門教程(第8版)》時,最新版本為JDK 11,這是Java SE 11使用的JDK版本!禞ava 11官方入門教程(第8版)》第1章介紹如何獲得Java JDK。
如果讀者使用早期版本的Java,也仍然可以閱讀《Java 11官方入門教程(第8版)》,只是無法編譯和運行使用了Java新功能的程序。
0.6 不要忘記Web上的代碼
《Java 11官方入門教程(第8版)》所有示例和編程項目的源代碼都可以免費從網(wǎng)址www.oraclepressbooks.com下載,也可以掃《Java 11官方入門教程(第8版)》封底二維碼下載。
0.7 特別感謝
特別感謝《Java 11官方入門教程(第8版)》的技術編輯Danny Coward。Danny編輯過我寫的多《Java 11官方入門教程(第8版)》籍,他的見解和建議總是很有價值,也很受贊賞。
0.8 進一步學習
《Java 11官方入門教程(第8版)》是引導讀者進入Herbert Schildt系列編程圖書的大門,下面的一些書你也會感興趣:
Java: The Complete Reference
Herb Schildts Java Programming Cookbook
The Art of Java
Swing: a Beginners Guide
Introducing JavaFX 8 Programming
Herbert Schildt是權威的Java語言專家、暢銷書作家。三十多年來,Herbert撰寫的程序設計圖書在全球的銷量達數(shù)百萬冊,并被翻譯成多種語言。Herbert已撰寫大量關于Java、C 、C和C#編程語言的書籍和文章,包括 《Java 9編程參考官方大全(第10版)》、Herb Schildts Java Programming Cookbook、Introducing JavaFX 8 Programming和Swing: A Beginners Guide。
Herbert對計算機的各個方面充滿興趣,其中投入精力最多的是計算機語言,尤其是計算機語言的標準化。Herbert是ANSI/ISO委員會的成員,參與了1989年C語言的標準化、1998年C 語言的標準化,以及2011年C 標準的更新。Herbert擁有伊利諾伊大學的學士和碩士學位。他的個人網(wǎng)站為www.HerbSchildt.com。
第1章 Java基礎 1
1.1 Java的歷史和基本原則 2
1.1.1 Java的起源 2
1.1.2 Java與C和C 的關系 3
1.1.3 Java對Internet的貢獻 3
1.1.4 Java的魔法:字節(jié)碼 4
1.1.5 超越applet 5
1.1.6 更快速的發(fā)布時間表 6
1.1.7 Java的主要術語 6
1.2 面向對象程序設計 6
1.2.1 封裝 7
1.2.2 多態(tài)性 8
1.2.3 繼承 8
1.3 Java開發(fā)工具包 8
1.4 第一個簡單的程序 9
1.4.1 輸入程序 9
1.4.2 編譯程序 10
1.4.3 逐行分析第一個程序 10
1.5 處理語法錯誤 12
1.6 第二個簡單程序 12
1.7 另一種數(shù)據(jù)類型 14
1.8 兩個控制語句 16
1.8.1 if語句 16
1.8.2 for循環(huán)語句 18
1.9 創(chuàng)建代碼塊 19
1.10 分號和定位 20
1.11 縮進原則 20
1.12 Java關鍵字 22
1.13 Java標識符 23
1.14 Java類庫 23
1.15 自測題 23
第2章 數(shù)據(jù)類型與運算符 25
2.1 數(shù)據(jù)類型為什么重要 26
2.2 Java的基本類型 26
2.2.1 整數(shù)類型 26
2.2.2 浮點型 27
2.2.3 字符型 28
2.2.4 布爾類型 29
2.3 字面值 31
2.3.1 十六進制、八進制和二進制字面值 31
2.3.2 字符轉義序列 32
2.3.3 字符串字面值 32
2.4 變量詳解 33
2.4.1 初始化變量 33
2.4.2 動態(tài)初始化 33
2.5 變量的作用域和生命期 34
2.6 運算符 36
2.7 算術運算符 36
2.8 關系運算符和邏輯運算符 37
2.9 短路邏輯運算符 39
2.10 賦值運算符 40
2.11 速記賦值 40
2.12 賦值中的類型轉換 41
2.13 不兼容類型的強制轉換 42
2.14 運算符的優(yōu)先級 43
2.15 表達式 45
2.15.1 表達式中的類型轉換 45
2.15.2 間距和圓括號 46
2.16 自測題 47
第3章 程序控制語句 49
3.1 從鍵盤輸入字符 50
3.2 if語句 51
3.2.1 嵌套if語句 52
3.2.2 if-else-if階梯狀結構 53
3.3 switch語句 54
3.4 for循環(huán) 58
3.4.1 for循環(huán)的一些變體 60
3.4.2 缺失部分要素的for循環(huán) 61
3.4.3 無限循環(huán) 61
3.4.4 沒有循環(huán)體的循環(huán) 62
3.4.5 在for循環(huán)內(nèi)部聲明循環(huán)控制變量 62
3.4.6 增強型for循環(huán) 63
3.5 while循環(huán) 63
3.6 do-while循環(huán) 64
3.7 使用break語句退出循環(huán) 69
3.8 將break語句作為一種goto語句使用 70
3.9 使用continue語句 73
3.10 嵌套循環(huán) 77
3.11 自測題 78
第4章 類、對象和方法 81
4.1 類的基礎知識 82
4.1.1 類的基本形式 82
4.1.2 定義類 83
4.2 如何創(chuàng)建對象 85
4.3 引用變量和賦值 85
4.4 方法 86
4.5 從方法返回值 88
4.6 返回值 89
4.7 使用形參 90
4.8 構造函數(shù) 98
4.9 帶形參的構造函數(shù) 99
4.10 深入介紹new運算符 100
4.11 垃圾回收 101
4.12 this關鍵字 101
4.13 自測題 103
第5章 其他數(shù)據(jù)類型與運算符 105
5.1 數(shù)組 106
5.2 多維數(shù)組 110
5.2.1 二維數(shù)組 110
5.2.2 不規(guī)則數(shù)組 111
5.2.3 三維或更多維的數(shù)組 112
5.2.4 初始化多維數(shù)組 112
5.3 另一種聲明數(shù)組的語法 113
5.4 數(shù)組引用賦值 114
5.5 使用length成員 115
5.6 for-each形式的循環(huán) 119
5.6.1 迭代多維數(shù)組 122
5.6.2 應用增強型for循環(huán) 123
5.7 字符串 123
5.7.1 構造字符串 124
5.7.2 操作字符串 124
5.7.3 字符串數(shù)組 126
5.7.4 字符串是不可變的 127
5.7.5 使用String控制switch語句 128
5.8 使用命令行實參 128
5.9 使用局部變量的類型推斷功能 130
5.9.1 引用類型的局部變量類型推斷 131
5.9.2 在for循環(huán)中使用局部變量類型推斷 132
5.9.3 var的一些限制 133
5.10 位運算符 133
5.10.1 位運算符的與、或、異或和非 134
5.10.2 移位運算符 137
5.10.3 位運算符的賦值速記符 139
5.11 ?運算符 141
5.12 自測題 143
第6章 方法和類詳解 145
6.1 控制對類成員的訪問 146
6.2 向方法傳遞對象 150
6.3 返回對象 153
6.4 方法重載 155
6.5 重載構造函數(shù) 159
6.6 遞歸 163
6.7 理解static關鍵字 165
6.8 嵌套類和內(nèi)部類 170
6.9 varargs 173
6.9.1 varargs基礎 173
6.9.2 重載varargs方法 175
6.9.3 varargs和歧義 177
6.10 自測題 178
第7章 繼承 179
7.1 繼承的基礎知識 180
7.2 成員訪問與繼承 182
7.3 構造函數(shù)和繼承 184
7.4 使用super調(diào)用超類構造函數(shù) 186
7.5 使用super訪問超類成員 189
7.6 創(chuàng)建多級層次結構 192
7.7 何時調(diào)用構造函數(shù) 195
7.8 超類引用和子類對象 196
7.9 方法重寫 200
7.10 重寫的方法支持多態(tài)性 202
7.11 為何使用重寫方法 203
7.12 使用抽象類 207
7.13 使用final 210
7.13.1 使用final防止重寫 210
7.13.2 使用final防止繼承 210
7.13.3 對數(shù)據(jù)成員使用final 211
7.14 Object類 212
7.15 自測題 213
第8章 包和接口 215
8.1 包 216
8.1.1 定義包 216
8.1.2 尋找包和CLASSPATH 217
8.1.3 一個簡短的包示例 217
8.2 包和成員訪問 218
8.3 理解被保護的成員 220
8.4 導入包 222
8.5 Java的類庫位于包中 223
8.6 接口 223
8.7 實現(xiàn)接口 224
8.8 使用接口引用 227
8.9 接口中的變量 233
8.10 接口能夠擴展 234
8.11 默認接口方法 235
8.11.1 默認方法的基礎知識 235
8.11.2 默認方法的實際應用 236
8.11.3 多繼承問題 237
8.12 在接口中使用靜態(tài)方法 238
8.13 私有接口方法 239
8.14 有關包和接口的最后思考 240
8.15 自測題 240
第9章 異常處理 241
9.1 異常的層次結構 242
9.2 異常處理基礎 242
9.2.1 使用關鍵字try和catch 242
9.2.2 一個簡單的異常示例 243
9.3 未捕獲異常的結果 245
9.4 使用多個catch語句 247
9.5 捕獲子類異常 247
9.6 try代碼塊可以嵌套 248
9.7 拋出異常 249
9.8 Throwable詳解 251
9.9 使用finally 252
9.10 使用throws語句 254
9.11 另外3種異常功能 255
9.12 Java的內(nèi)置異常 256
9.13 創(chuàng)建異常子類 258
9.14 自測題 262
第10章 使用I/O 265
10.1 基于流的Java I/O 266
10.2 字節(jié)流和字符流 266
10.3 字節(jié)流類 266
10.4 字符流類 267
10.5 預定義流 267
10.6 使用字節(jié)流 268
10.6.1 讀取控制臺輸入 269
10.6.2 寫入控制臺輸出 269
10.7 使用字節(jié)流讀寫文件 270
10.7.1 從文件輸入 270
10.7.2 寫入文件 273
10.8 自動關閉文件 275
10.9 讀寫二進制數(shù)據(jù) 277
10.10 隨機訪問文件 281
10.11 使用Java字符流 283
10.11.1 使用字符流的控制臺輸入 284
10.11.2 使用字符流的控制臺輸出 286
10.12 使用字符流的文件I/O 287
10.12.1 使用FileWriter 287
10.12.2 使用FileReader 288
10.13 使用Java的類型封裝器轉換數(shù)值字符串 289
10.14 自測題 296
第11章 多線程程序設計 299
11.1 多線程的基礎知識 300
11.2 Thread類和Runnable接口 300
11.3 創(chuàng)建一個線程 301
11.4 創(chuàng)建多個線程 309
11.5 確定線程何時結束 311
11.6 線程的優(yōu)先級 314
11.7 同步 316
11.8 使用同步方法 317
11.9 同步語句 319
11.10 使用notify( )、wait( )和notifyAll( )的線程通信 321
11.11 線程的掛起、繼續(xù)執(zhí)行和停止 326
11.12 自測題 330
第12章 枚舉、自動裝箱、靜態(tài)導入和注解 333
12.1 枚舉 334
12.2 Java語言中的枚舉是類類型 336
12.3 values( )和valueOf( )方法 336
12.4 構造函數(shù)、方法、實例變量和枚舉 337
12.5 枚舉繼承enum 339
12.6 自動裝箱 344
12.7 類型封裝器 344
12.8 自動裝箱的基礎知識 346
12.9 自動裝箱和方法 347
12.10 發(fā)生在表達式中的自動裝箱/自動拆箱 348
12.11 靜態(tài)導入 349
12.12 注解(元數(shù)據(jù)) 352
12.13 自測題 354
第13章 泛型 355
13.1 泛型的基礎知識 356
13.2 簡單的泛型示例 356
13.2.1 泛型只能用于引用類型 359
13.2.2 泛型類型是否相同基于其類型實參 359
13.2.3 帶有兩個類型形參的泛型類 360
13.2.4 泛型類的一般形式 361
13.3 受限類型 361
13.4 使用通配符實參 364
13.5 受限通配符 366
13.6 泛型方法 369
13.7 泛型構造函數(shù) 370
13.8 泛型接口 371
13.9 原類型和遺留代碼 377
13.10 使用菱形運算符進行類型推斷 379
13.11 局部變量類型推斷和泛型 380
13.12 擦除特性 380
13.13 歧義錯誤 380
13.14 一些泛型限制 381
13.14.1 類型形參不能實例化 381
13.14.2 對靜態(tài)成員的限制 381
13.14.3 泛型數(shù)組限制 382
13.14.4 泛型異常限制 383
13.15 繼續(xù)學習泛型 383
13.16 自測題 383
第14章 lambda表達式和方法引用 385
14.1 lambda表達式簡介 386
14.1.1 lambda表達式的基礎知識 386
14.1.2 函數(shù)式接口 387
14.1.3 幾個lambda表達式示例 389
14.2 塊lambda表達式 392
14.3 泛型函數(shù)式接口 393
14.4 lambda表達式和變量捕獲 398
14.5 從 lambda表達式中拋出異常 399
14.6 方法引用 401
14.6.1 靜態(tài)方法的方法引用 401
14.6.2 實例方法的方法引用 402
14.7 構造函數(shù)引用 406
14.8 預定義的函數(shù)式接口 408
14.9 自測題 409
第15章 模塊 411
15.1 模塊基礎 412
15.1.1 簡單的模塊示例 413
15.1.2 編譯、運行第一個模塊示例 416
15.1.3 requires和exports 417
15.2 java.base和平臺模塊 417
15.3 舊代碼和未命名的模塊 418
15.4 導出到特定的模塊 419
15.5 使用requires transitive 420
15.6 使用服務 423
15.6.1 服務和服務提供程序的基礎知識 423
15.6.2 基于服務的關鍵字 424
15.6.3 基于模塊的服務示例 424
15.7 其他模塊功能 430
15.7.1 open模塊 430
15.7.2 opens語句 430
15.7.3 requires static 430
15.8 繼續(xù)模塊的學習 431
15.9 自測題 431
第16章 Swing介紹 433
16.1 Swing的起源和設計原則 434
16.2 組件和容器 435
16.2.1 組件 435
16.2.2 容器 436
16.2.3 頂級容器窗格 436
16.3 布局管理器 436
16.4 第一個簡單的Swing程序 437
16.5 Swing事件處理 440
16.5.1 事件 441
16.5.2 事件源 441
16.5.3 事件監(jiān)聽器 441
16.5.4 事件類和監(jiān)聽器接口 441
16.6 使用JButton 442
16.7 使用JTextField 445
16.8 使用JCheckBox 448
16.9 使用JList 450
16.10 使用匿名內(nèi)部類或lambda表達式來處理事件 458
16.11 自測題 459
附錄A 自測題答案 461
附錄B 使用Java的文檔注釋 495
附錄C 編譯運行簡單的單文件程序 503
附錄D JShell簡介 505
附錄E 更多Java關鍵字 513