編輯推薦
基於Java SE 8新規範,由Java語言發明者編寫的Java語言必讀參考書, Java程序員精進的必讀經典!
內容簡介
本書是Java語言新版本的規範,全書從Java基礎的文法、類型、變量到高級特性lambda錶達式、綫程與鎖等進行瞭詳盡闡述。該規範針對每一項語言特性都給齣瞭代錶性的示例程序,以幫助讀者更容易地理解和掌握這些特性。讀者通過閱讀本規範,可以全麵係統地瞭解Java語言的各項特性,為充分利用這些特性來編寫齣更加高效簡潔的Java程序提供幫助。讀者還可以從Oracle的Java官方網站上看到本書的新進展和修訂,以瞭解Java語言的新發展動嚮。
目錄
The Java Language Specification, Java SE 8 Edition
齣版者的話
譯者序
前言
第1章 概述 1
1.1 本書結構 1
1.2 樣例程序 4
1.3 錶示法 4
1.4 與預定義的類和接口的關係 4
1.5 反饋 5
1.6 參考文獻 5
第2章 文法 6
2.1 上下文無關文法 6
2.2 詞法 6
2.3 句法 6
2.4 文法錶示法 6
第3章 詞法結構 9
3.1 Unicode 9
3.2 詞法翻譯 10
3.3 Unicode轉義字符 10
3.4 行終止符 11
3.5 輸入元素和符號 12
3.6 空白字符 12
3.7 注釋 13
3.8 標識符 14
3.9 關鍵字 15
3.10 字麵常量 15
3.10.1 整數字麵常量 15
3.10.2 浮點數字麵常量 19
3.10.3 布爾字麵常量 21
3.10.4 字符字麵常量 21
3.10.5 字符串字麵常量 22
3.10.6 字符和字符串字麵常量的
轉義序列 23
3.10.7 空字麵常量 24
3.11 分隔符 24
3.12 操作符 24
第4章 類型、值和變量 25
4.1 類型和值的種類 25
4.2 簡單類型和值 25
4.2.1 整數類型和值 26
4.2.2 整數操作 26
4.2.3 浮點數類型、格式和值 27
4.2.4 浮點數操作 29
4.2.5 boolean類型和布爾值 31
4.3 引用類型和值 32
4.3.1 對象 33
4.3.2 Object類 35
4.3.3 String類 35
4.3.4 當引用類型相同時 35
4.4 類型變量 36
4.5 參數化類型 37
4.5.1 參數化類型的類型引元 38
4.5.2 參數化類型的成員和構造器 40
4.6 類型擦除 40
4.7 可具化類型 41
4.8 原生類型 42
4.9 交集類型 45
4.10 子類型化 45
4.10.1 簡單類型之間的子類型化 46
4.10.2 類與接口類型之間的子類型化 46
4.10.3 數組類型之間的子類型化 47
4.10.4 最低上邊界 47
4.11 使用類型之處 49
4.12 變量 52
4.12.1 簡單類型的變量 52
4.12.2 引用類型的變量 52
4.12.3 變量的種類 54
4.12.4 final變量 55
4.12.5 變量的初始值 56
4.12.6 類型、類和接口 57
第5章 類型轉換與上下文 59
5.1 轉換的種類 61
5.1.1 標識轉換 61
5.1.2 拓寬簡單類型轉換 61
5.1.3 窄化簡單類型轉換 62
5.1.4 拓寬和窄化簡單類型轉換 64
5.1.5 拓寬引用類型轉換 64
5.1.6 窄化引用類型轉換 64
5.1.7 裝箱轉換 65
5.1.8 拆箱轉換 66
5.1.9 非受檢轉換 67
5.1.10 捕獲轉換 67
5.1.11 字符串轉換 69
5.1.12 被禁止的轉換 69
5.1.13 值集轉換 70
5.2 賦值上下文 70
5.3 方法調用上下文 74
5.4 字符串上下文 75
5.5 強製類型轉換上下文 75
5.5.1 引用類型強製類型轉換 77
5.5.2 受檢強製類型轉換和非受檢強製類型轉換 79
5.5.3 運行時的受檢強製類型轉換 80
5.6 數字上下文 81
5.6.1 一元數字提升 82
5.6.2 二元數字提升 83
第6章 名字 84
6.1 聲明 84
6.2 名字與標識符 89
6.3 聲明的作用域 91
6.4 遮蔽和遮掩 93
6.4.1 遮蔽 94
6.4.2 遮掩 96
6.5 確定名字的含義 97
6.5.1 根據上下文的名字的句法分類 98
6.5.2 對上下文歧義名字的重分類 100
6.5.3 包名的含義 101
6.5.4 PackageOrTypeNames的含義 102
6.5.5 類型名的含義 102
6.5.6 錶達式名的含義 103
6.5.7 方法名的含義 105
6.6 訪問控製 106
6.6.1 確定可訪問性 107
6.6.2 受保護訪問權限的細節 110
6.7 完全限定名和規範名 111
第7章 包 113
7.1 包成員 113
7.2 主機對包的支持 114
7.3 編譯單元 115
7.4 包聲明 116
7.4.1 具名包 116
7.4.2 不具名包 116
7.4.3 包的可觀察性 117
7.5 導入聲明 117
7.5.1 單類型導入聲明 118
7.5.2 按需類型導入聲明 119
7.5.3 單靜態導入聲明 120
7.5.4 按需靜態導入聲明 120
7.6 頂層類型聲明 121
第8章 類 123
8.1 類聲明 124
8.1.1 類修飾符 124
8.1.2 泛化類和類型參數 126
8.1.3 內部類和包圍實例 128
8.1.4 超類和子類 130
8.1.5 超接口 132
8.1.6 類體和成員聲明 134
8.2 類成員 135
8.3 域聲明 138
8.3.1 域修飾符 141
8.3.2 域的初始化 145
8.3.3 在域初始化過程中的嚮前引用 146
8.4 方法聲明 148
8.4.1 形參 149
8.4.2 方法簽名 152
8.4.3 方法修飾符 152
8.4.4 泛化方法 156
8.4.5 方法的結果 157
8.4.6 方法拋齣異常 157
8.4.7 方法體 158
8.4.8 繼承、覆蓋和隱藏 159
8.4.9 重載 166
8.5 成員類型聲明 168
8.5.1 靜態成員類型聲明 169
8.6 實例初始化器 169
8.7 靜態初始化器 169
8.8 構造器聲明 170
8.8.1 形參 170
8.8.2 構造器簽名 171
8.8.3 構造器修飾符 171
8.8.4 泛化構造器 172
8.8.5 構造器拋齣異常 172
8.8.6 構造器的類型 172
8.8.7 構造器體 172
8.8.8 構造器重載 176
8.8.9 缺省構造器 176
8.8.10 阻止類的實例化 177
8.9 枚舉類型 177
8.9.1 枚舉常量 178
8.9.2 枚舉體聲明 178
8.9.3 枚舉成員 180
第9章 接口 184
9.1 接口聲明 184
9.1.1?接口修飾符 185
9.1.2 泛化接口和類型參數 185
9.1.3 超接口和子接口 186
9.1.4 接口體和成員聲明 187
9.2 接口成員 187
9.3 域(常量)聲明 187
9.3.1 接口中域的初始化 189
9.4 方法聲明 189
9.4.1 繼承和覆蓋 190
9.4.2 重載 193
9.4.3 接口方法體 193
9.5 成員類型聲明 193
9.6 注解類型 194
9.6.1 注解類型元素 195
9.6.2 注解類型元素的缺省值 197
9.6.3 可重復的注解類型 198
9.6.4 預定義的注解類型 200
9.7 注解 204
9.7.1 普通注解 205
9.7.2 標記注解 207
9.7.3 單元素注解 207
9.7.4 注解可以齣現在何處 208
9.7.5 同種類型的多重注解 211
9.8 函數型接口 212
9.9 函數類型 214
......
前言/序言
The Java Language Specification, Java SE 8 Edition1996年,James Gosling、Bill Joy和Guy Steele為《Java語言規範》第1版寫下瞭下麵的話:
“我們相信Java編程語言是一種成熟的語言,已經為廣泛使用做好瞭準備。但是,我們還是期望該語言的某些演化會在未來幾年內齣現。我們希望能夠以與已有應用完全兼容的方式來管理這種演化。”
Java SE 8是Java語言在其曆史上最大的演化版本。一組數量相對較小的特徵,包括lambda錶達式、方法引用和函數型接口,組閤起來提供瞭融閤麵嚮對象風格和函數型風格的編程模型。在Brian Goetz的領導下,這種融閤是以鼓勵最佳實踐的方式完成的,包括不可變性、無狀態性、組閤性,同時,保留瞭“Java的感覺”,即可讀性、簡單性和普適性。
重要的是,Java SE平颱的庫在隨Java語言一起演化。這意味著使用lambda錶達式和方法引用來錶示行為,例如應用到列錶中每個元素上的操作,具有“打破常規”的高生産率和高性能。按照類似的模式,Java虛擬機也在隨Java語言一起演化,以確保在分離編譯的約束下,支持庫演化的缺省方法在編譯時和運行時都盡可能地保持一緻。
嚮Java語言中添加第一流功能的倡議始於20世紀90年代。BGGA和CICE提齣的circa 2007為該話題帶來瞭新的活力,而OpenJDK circa 2009中Project lambda的創建更是吸引瞭人們極大的興趣。Java SE 7中嚮JVM添加瞭方法句柄,這為添加新的實現技術同時保持“編寫一次,處處運行”的特性打開瞭一扇門。最後,由JSR 335 《用於Java編程語言的lambda錶達式》將變化引入到瞭Java語言中,JSR 335專傢組包括Joshua Bloch、Kevin Bourrillion、Andrey Breslav、Rémi Forax、Dan Heidinga、Doug Lea、Bob Lee、David Lloyd、Sam Pullara、Srikanth Sankaran和Vladimir Zakharov。
編程語言設計一般總是會涉及與復雜程度的角力,而這種復雜程度是完全嚮語言的用戶屏蔽的。(因此,編程語言的設計經常被比作冰山:90%是不可見的,因為它們“在水下”。)在JSR 335中,最大的復雜性潛藏於隱式類型的lambda錶達式與重載解析的交互中。在這個領域以及其他許多領域,Oracle公司的Dan Smith完成瞭一項傑齣的工作,即透徹地描述瞭期望的行為。他的話在本規範中通篇都可以找到,包括全新的第18章。
在Java SE 8中另一項創意是提升注解的效用,而注解是Java語言中最流行的特性之一。首先,Java文法已經擴展為允許對許多語言結構的類型使用注解,從而形成瞭如Checker Framework等新型靜態分析工具的基礎。這個特性是通過由Michael Ernst 和包括我自己、Doug Lea以及Srikanth Sankaran組成的專傢組主導的JSR 308《Java類型上的注解》描述的。本規範涉及的變更是廣泛的,而且Michael Ernst和Werner Dietl多年來所做齣的不懈努力得到瞭認可。其次,注解可以在同一個語言結構上“重復”,使得使用注解類型建模特定領域配置的API大受裨益。Michael Keith和Bill Shannon在Java EE中首倡並指導瞭這項特性。
Oracle公司Java 平颱組的許多同事都為本規範提供瞭非常有價值的支持,他們是:Leonid Arbouzov、Mandy Chung、Joe Darcy、Robert Field、Joel Franck、Sonali Goel、 Jon Gibbons、Jeannette Hung、Stuart Marks、Eric McCorkle、Matherey Nunez、 Mark Reinhold、Vicente Romero、John Rose、Georges Saab、Steve Sides、Bernard Traversat和Michel Trudeau。
也許,最誠摯的感謝必須獻給使本規範變得“真實”的編譯器工程師。Oracle公司的Maurizio Cimadamore從早期對lambda錶達式的設計及其在javac中的實現開始,就一直進行著超人般的工作。在Eclipse中支持Java SE 8的特性是由下列人員實現的:Jayaprakash Arthanareeswaran、Shankha Banerjee、Anirban Chakraborty、 Andrew Clement、Stephan Herrmann、Markus Keller、Jesper M?ller、Manoj Palat、Srikanth Sankaran和Olivier Thomann;在IntelliJ 中支持Java SE 8的特性是由下列人員實現的:Anna Kozlova、Alexey Kudravtsev和Roman Shevchenko。他們做齣的貢獻值得整個Java社區感謝。
Java SE 8是Java語言的復興。盡管有些人在追尋“下一種偉大的語言”,但是我們相信用Java編程比以往更加令人激動並具有更高的生産率。我們希望它對你而言也是經久耐用的。
Alex Buckley加利福尼亞州聖剋拉拉2014年3月
《Java語言規範:Java SE 8》 深入理解Java SE 8核心精髓,構建強大、健壯的Java應用 本書並非一本枯燥乏味的語法手冊,而是Java語言設計者們精心打磨的官方指南,旨在為開發者提供一個全麵、深入且權威的Java SE 8語言解析。如果您希望超越簡單的“如何編寫”的層麵,真正理解Java語言的“為何如此”,那麼這本書將是您不可或缺的伴侶。它將帶領您穿越Java SE 8的每一個角落,從最基礎的語法結構到最精妙的運行時行為,揭示其內在邏輯和設計哲學,讓您對Java這門語言産生全新的認識,並能更高效、更優雅地駕馭它。 為什麼需要一本如此深入的語言規範? 在軟件開發的世界裏,理解並掌握一門編程語言的底層機製,是邁嚮精通的關鍵一步。許多開發者習慣於依賴IDE的自動補全、調試器以及各種教程來學習Java。然而,當遇到一些不常見的語言特性、微妙的運行時行為,或是需要進行性能優化、排查疑難雜癥時,僅僅停留在錶麵知識是遠遠不夠的。 《Java語言規範:Java SE 8》正是填補這一鴻溝的橋梁。它提供瞭關於Java SE 8的權威定義,涵蓋瞭從詞法結構、錶達式、語句、類、接口、枚舉,到並發模型、內存模型等所有核心概念。閱讀本書,您將能夠: 精準理解語言特性: 深入剖析Java SE 8的每一個語法點,例如lambda錶達式、方法引用、類型推斷、默認方法、Stream API等新特性,以及它們背後的設計考量。您將不再僅僅是“會用”,而是“為什麼這樣設計”以及“在什麼場景下最能發揮其優勢”。 掌握底層運行機製: 揭示Java虛擬機(JVM)如何執行Java代碼,包括類加載、內存管理(堆、棧、方法區)、垃圾迴收機製、綫程的創建與同步等。這將幫助您更好地理解程序的性能錶現,並能主動地進行性能調優。 洞悉類型係統和對象模型: 深入理解Java的強類型特性,包括類型兼容性、多態性、繼承、接口實現等。您將能更準確地把握對象的生命周期、引用與值的區彆,以及如何構建清晰、可維護的對象模型。 馴服並發編程的復雜性: Java SE 8在並發方麵引入瞭更多強大的工具和模型。本書將詳細講解Java內存模型(JMM),以及`volatile`關鍵字、`synchronized`關鍵字、`Lock`接口、`Atomic`類等並發原語的正確用法和工作原理,幫助您編寫綫程安全的代碼,避免競態條件、死鎖等常見問題。 學習標準庫的設計哲學: 許多Java標準庫的設計都遵循瞭語言規範的原則。通過理解語言本身,您能更好地理解標準庫的設計意圖,從而更有效地利用它們。 提升代碼質量和健壯性: 對語言規範的深刻理解,能幫助您編寫齣更符閤Java設計思想、更具可讀性、可維護性以及更高健壯性的代碼。 成為更優秀的Java開發者: 最終,本書的目標是幫助您從一個Java使用者,晉升為一個對Java語言有深刻理解的Java專傢。 本書將帶您探索的精彩領域: 《Java語言規範:Java SE 8》並非羅列語法條文,而是以一種清晰、結構化的方式,引導您逐步深入Java SE 8的核心。本書的每一章都緊密相連,構建起一個完整的Java SE 8知識體係。 第一部分:語言基礎與語法結構 詞法結構: 從最基礎的標識符、關鍵字、字麵量、運算符、分隔符入手,理解Java代碼的構成元素。 類型係統: 深入剖析Java的原始類型和引用類型,理解它們的區彆、錶示範圍以及在內存中的存儲方式。 錶達式與語句: 詳細講解各類錶達式的求值順序,以及控製流語句(順序、分支、循環)的執行邏輯。 類與對象: 探索類的定義、實例的創建、字段、方法、構造器,以及封裝、繼承、多態等麵嚮對象的核心概念。 接口與抽象類: 理解接口的作用,以及抽象類與接口的異同,學習如何利用它們構建靈活的係統。 枚舉: 深入理解枚舉的本質,以及如何安全、高效地使用它。 第二部分:Java SE 8新特性深度解析 Lambda錶達式: 詳細講解Lambda錶達式的語法、功能、類型推斷,以及它與函數式接口的協同工作。理解其如何簡化匿名內部類的編寫,並為函數式編程奠定基礎。 方法引用: 剖析不同類型的方法引用(靜態方法、實例方法、構造器引用),以及它們如何與Lambda錶達式協同使用,進一步提高代碼的簡潔性。 Stream API: 深入理解Stream API的設計理念,包括流的生成、中間操作(如`filter`、`map`、`sorted`)和終端操作(如`forEach`、`collect`、`reduce`)。掌握其惰性求值和短路求值機製,以及並行流的運用。 默認方法: 講解接口中允許定義默認實現的方法,以及它如何解決接口演進中的兼容性問題。 Optional類: 掌握`Optional`類的使用,用於避免`NullPointerException`,並編寫更具聲明式和可讀性的代碼。 第三部分:內存模型與並發編程 Java內存模型(JMM): 這是本書的重頭戲之一。深入理解Java內存模型,包括工作內存、主內存、內存可見性、原子性、有序性等概念。 `volatile`關鍵字: 詳細講解`volatile`關鍵字的作用,以及它如何保證內存可見性和禁止指令重排。 `synchronized`關鍵字與鎖: 深入剖析`synchronized`關鍵字的鎖機製,包括對象鎖、類鎖,以及鎖的粒度、死鎖的可能性。 `Lock`接口與`ReentrantLock`: 學習比`synchronized`更靈活、更強大的`Lock`接口,以及`ReentrantLock`的特性和使用場景。 原子類: 掌握`java.util.concurrent.atomic`包下的原子類,瞭解它們如何通過CAS(Compare-And-Swap)機製實現無鎖的原子操作。 綫程的創建與管理: 講解`Thread`類、`Runnable`接口,以及`ExecutorService`框架的使用。 第四部分:其他重要概念與細節 異常處理: 深入理解Java的異常層次結構,以及`try-catch-finally`、`throws`等關鍵字的用法。 泛型: 剖析泛型的類型擦除機製,理解泛型在編譯時提供類型安全,以及其在集閤、自定義類中的應用。 注解: 講解注解的定義、使用及其元注解,瞭解它們在框架、反射等方麵的應用。 類加載機製: 深入理解JVM的類加載過程,包括加載、連接(驗證、準備、解析)和初始化,以及自定義類加載器的可能性。 JVM執行模型: 簡要介紹JVM的字節碼執行、即時編譯(JIT)等概念,幫助理解代碼的實際執行過程。 本書的目標讀者: 希望深入理解Java語言底層機製的開發者: 無論是初學者還是資深開發者,隻要您希望跳齣“知其然”,更求“知其所以然”,本書都將為您提供寶貴的知識。 需要進行Java語言性能調優的工程師: 深刻理解內存模型、並發機製是進行高效性能調優的基礎。 緻力於編寫高質量、高健壯性Java代碼的架構師和技術領導者: 準確理解語言規範,有助於設計齣更符閤工程實踐的解決方案。 正在準備Java相關的權威認證考試的考生: 本書內容是許多高級Java認證考試的必備知識點。 對編程語言設計哲學感興趣的讀者: 通過理解Java SE 8的設計,可以窺探現代編程語言的設計趨勢和取捨。 為何選擇《Java語言規範:Java SE 8》? 在海量的Java學習資源中,《Java語言規範:Java SE 8》以其權威性、全麵性和嚴謹性脫穎而齣。它不是某位開發者個人的理解,而是Java語言標準委員會的集體智慧結晶。這本書將帶您進入Java SE 8的“官方殿堂”,直接聆聽語言的設計者對語言的解讀。 總結: 《Java語言規範:Java SE 8》是一部裏程碑式的著作,它以一種係統、深入的方式,為您揭示瞭Java SE 8語言的精髓。它將幫助您理解Java語言的每一個細節,掌握其核心機製,從而成為一個更具洞察力、更高效、更自信的Java開發者。如果您決心在Java技術領域不斷精進,這本書將是您最忠實、最可靠的嚮導。投入時間和精力去理解這本書,您所獲得的迴報將是巨大的,它將重塑您對Java的認知,並為您的職業生涯帶來長遠的影響。