編輯推薦
基於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 下載 mobi epub pdf txt 電子書