- 使用編譯器、解釋器和其他工具完成Java開發(fā)。
- 探索Java內(nèi)置的線程功能和并發(fā)包。
- 學(xué)習(xí)文本處理和強大的正則表達式API。
- 編寫高級網(wǎng)絡(luò)應(yīng)用或基于Web的應(yīng)用和服務(wù)。
如果你剛接觸Java或者剛開始學(xué)習(xí)編程,這本暢銷書會帶你學(xué)習(xí)Java 11及以上版本的語言特性和API。通過富有吸引力、趣味性和實用性的示例,并且始終著眼于構(gòu)建實際的應(yīng)用,這本書的作者Marc Loy、Patrick Niemeyer和Daniel Leuck全面介紹了Java的基礎(chǔ)知識,包括其類庫、編程技術(shù)和慣用方法。
除了學(xué)習(xí)最新Java版本中的核心語言特性,你還會學(xué)習(xí)一些功能強大的新方法來管理應(yīng)用中的資源和異常。
前言
這是一本關(guān)于Java 編程語言和開發(fā)環(huán)境的書。無論你是一個軟件開發(fā)人員,還是僅在日常生活中使用互聯(lián)網(wǎng)的普通人,毫無疑問,你肯定聽說過Java。Java 的引入是Web 發(fā)展史上最令人興奮的事情之一,Java 的應(yīng)用為互聯(lián)網(wǎng)上業(yè)務(wù)的增長提供了極大的動力?梢哉f,Java 是世界上最流行的編程語言之一,數(shù)以百萬計的開發(fā)人員在可能想象到的幾乎所有類型的計算機上使用Java。在開發(fā)人員需求方面,Java 已經(jīng)超越C 和Visual Basic 等語言;對于某些類型的開發(fā),Java 已經(jīng)成為事實上的標(biāo)準(zhǔn)語言,尤其是基于Web 的服務(wù),F(xiàn)在大多數(shù)大學(xué)都在計算機入門課程中使用了Java 語言及其他一些重要的現(xiàn)代語言,也許你正在你的某門課程中使用本書!
本書會為你提供Java 的基礎(chǔ)知識和API 的全面介紹。作為一本名符其實的入門書,本書描述了Java 語言及其類庫、編程技術(shù)和慣用方法。在本書中,我們將會深入探討一些有趣的領(lǐng)域,還會觸及其他流行主題的一點皮毛。OReilly 的其他書籍會擴展我們介紹的內(nèi)容,提供有關(guān)Java 特定領(lǐng)域及應(yīng)用的更全面的信息。
我們會盡可能提供富有吸引力、實用性和趣味性的例子,而不僅僅是羅列Java 的語言特性。雖然這些例子很簡單,但也可以提示我們能夠做什么。在本書中,我們并不會開發(fā)下一個殺手級應(yīng)用,而是希望你能以此為起點,并能啟發(fā)你經(jīng)過數(shù)小時的試驗和修改,開發(fā)出你自己的一流應(yīng)用。
本書面向的讀者
本書主要面向計算機專業(yè)人士、學(xué)生、技術(shù)人員及黑客。如果著眼于構(gòu)建實際的應(yīng)用,需要獲取Java 語言的第一手經(jīng)驗,本書將能滿足你的需求。本書還可以作為學(xué)習(xí)面向?qū)ο缶幊、網(wǎng)絡(luò)編程和用戶界面設(shè)計的一個絕佳教程。在學(xué)習(xí)Java 的同時,你還會學(xué)到一種強大而實用的軟件開發(fā)方法。首先我們將深入了解Java 的基礎(chǔ)知識和API。
從表面上看,Java 很像C 或C ,所以如果你有使用C 或C 語言的一些經(jīng)驗,那么學(xué)習(xí)本書時就會有一點小小的優(yōu)勢。如果沒有,也不要擔(dān)心。無須過分強調(diào)Java與C 或C 之間的語法相似性。在許多方面,Java 更類似于Smalltalk 和Lisp 等動態(tài)語言。如果你了解另外一種面向?qū)ο缶幊陶Z言,這當(dāng)然會有幫助,不過你可能需要改變一些想法,還要摒棄一些習(xí)慣。Java 語言比C 和Smalltalk 等語言要簡單得多。如果你善于從簡潔的例子和個人實踐中學(xué)習(xí),相信你肯定會喜歡本書。
本書的最后一部分將會在Web 應(yīng)用、Web 服務(wù)和請求處理等上下文中討論Java 語言,所以你要熟悉Web 瀏覽器、服務(wù)器和文檔的基本思想。
新發(fā)展
本書實際上是原來流行的《Exploring Java》系列的第7 版,不過本書已經(jīng)更新并改名。對于每一版我們都會精心設(shè)計,不僅會增加涵蓋額外特性的新內(nèi)容,而且全面修訂和更新已有內(nèi)容,力求內(nèi)容完整周密,還會補充多年來積累的實用想法和實踐經(jīng)驗。在最近的幾個版本中,一個值得注意的變化是我們不再強調(diào)applet 的使用,這反映出近年來applet 在創(chuàng)建交互式Web 頁面方面的作用已經(jīng)減弱。相比之下,我們大大擴展了Java Web 應(yīng)用和Web 服務(wù)方面的內(nèi)容,這些是當(dāng)前流行的成熟技術(shù)。
我們會介紹Java 最新的長期支持版本[OpenJDK 11,官方稱其為Java 標(biāo)準(zhǔn)版(SE)11] 的所有重要特性,不過我們還加入了特性版本Java 12、Java 13 和Java 14的一些細(xì)節(jié)。這些年來,Sun Microsystems(被Oracle 收購之前Java 的所有者)多次改變Java 的命名機制。Sun Microsystems 創(chuàng)造了Java 2 一詞來涵蓋Java 1.2 引入的新特性,另外摒棄了術(shù)語JDK 而代之以SDK。到了第6 版,Sun Microsystems 從Java 1.4 版本跳到Java 5.0 版本,不過暫緩放棄術(shù)語JDK,并保留了它的編號約定。
自此之后,我們又有了Java 6、Java 7 等,直到現(xiàn)在的Java 14。
Java 的這一版本體現(xiàn)出了一個成熟語言的特質(zhì),只是偶爾會對API 和庫做一些語法修改和更新。我們會努力展示這些新特性,并對本書中的每一個示例進行了更新,以反映當(dāng)前的Java 實踐和風(fēng)格。
這一版新增內(nèi)容(Java 11, 12, 13, 14)
本書會延續(xù)我們的傳統(tǒng),對內(nèi)容進行全面改造,盡可能做到內(nèi)容完整而且是最新的。
本書結(jié)合了Java 11(長期支持版本)和Java 12、Java 13 和Java 14 等特性版本的更新( 對于最新版本中包含和去除了哪些Java 特性,更多細(xì)節(jié)請參見第13 章)。這一版新增內(nèi)容包括:
新的語言特性,包括泛型中的類型推導(dǎo)及改進的異常處理和自動化資源管理語法。
可用于試驗代碼段的新交互式環(huán)境jshell。
新提出的switch 表達式。
基本的lambda 表達式。
全面更新的示例和分析。
使用本書
本書的組織結(jié)構(gòu)大致如下:
第1 章和第2 章介紹了Java 的基本概念,并提供了一個幫助你對Java 編程快速入門的教程。
第3 章討論了用于Java 開發(fā)的一些基本工具,包括編譯器、解釋器、jshell 和JAR 文件包。
第4 章和第5 章介紹了編程的基礎(chǔ)知識,然后描述了Java 語言本身,從基本語法開始,介紹了類和對象、異常、數(shù)組、枚舉、注解及很多其他方面的內(nèi)容。
第6 章介紹了異常、錯誤和Java 內(nèi)置的日志功能。
第7 章介紹了集合及Java 中的泛型和參數(shù)化類型。
第8 章介紹了文本處理、格式化、掃描、字符串工具及很多核心API 工具。
第9 章介紹了Java 語言內(nèi)置的線程功能。
第10 章介紹了使用Swing 進行圖形用戶界面(GUI)開發(fā)的基礎(chǔ)知識。
第11 章介紹了Java I/O、流、文件、Socket、網(wǎng)絡(luò)和NIO 包。
第12 章介紹了使用Servlet、Servlet 過濾器、WAR 文件的Web 應(yīng)用和Web 服務(wù)。
第13 章介紹了Java Community Process(JCP),重點說明了如何跟蹤Java 未來的變化,以及幫助你利用新特性改造已有的代碼,如如何利用Java 8 中引入的lambda 表達式等。
如果你像我們一樣,可能不會從頭到尾地看書。另外如果你真的像我們一樣,通常根本不會看前言。不過,如果你恰好看了這個前言,這里有幾個建議:
如果你已經(jīng)是一個程序員,只需要用很短的時間學(xué)習(xí)Java,或者可能想找一些例子,那么可以先看看第2 章的教程。如果這還不能讓你滿意,至少應(yīng)該看看第3章的內(nèi)容,其中闡述了如何使用編譯器和解釋器。這應(yīng)該能讓你入門。
如果你對編寫網(wǎng)絡(luò)程序或基于Web 的應(yīng)用和服務(wù)感興趣,那么第11 章和第12章應(yīng)該可以滿足你的需求。網(wǎng)絡(luò)仍然是Java 應(yīng)用中比較有趣和重要的一部分。
第10 章討論了Java 的圖形特性和組件架構(gòu)。如果你對利用Java 編寫GUI 感興趣,那么應(yīng)該看看這一章。
第13 章討論了如何跟蹤Java 語言本身的變化。不論你關(guān)注的是什么,都應(yīng)該看看。
在線資源
Java 有很多在線資源。Oracle 的Java 官方網(wǎng)站是https://oreil.ly/Lo8QZ;你可以在這里查找、更新和下載各個Java 版本。在這里你還可以找到JDK 的參考實現(xiàn),包括編譯器、解釋器及其他工具。
Oracle 還運營維護著OpenJDK 網(wǎng)站(https://oreil.ly/DrTm4)。這里有Java 及其相關(guān)工具的主要開源版本。我們將使用OpenJDK 完成這本書的所有示例。
你還應(yīng)該訪問OReilly 的網(wǎng)站(http://oreilly.com/)。你會在這里找到其他關(guān)于Java及大量其他主題的OReilly 書籍的信息。你還應(yīng)該看看另外一些在線學(xué)習(xí)和會議網(wǎng)站OReilly 真心擁護各種不同的教育形式。
當(dāng)然,你還可以訪問本書的主頁(http://oreil.ly/Java_5E)!
本書使用約定
這本書中使用的字體約定很簡單。
斜體用于(Italic):
路徑名、文件名和程序名;
互聯(lián)網(wǎng)地址,如域名和URL;
首次定義的術(shù)語;
程序名、編譯器、解釋器、工具和命令;
線程。
定寬字體用于(Constant width):
Java 程序中的所有內(nèi)容,包括方法名、變量名和類名;
HTML 或XML 文檔中出現(xiàn)的標(biāo)記;
關(guān)鍵字、對象和環(huán)境變量。
定寬粗體用于(Constant width bold):
用戶在命令行或?qū)υ捒蛑墟I入的文本。
定寬斜體用于(Constant width italic):
代碼中可替換的元素。
在正文中,我們總是在方法名后面使用一對空括號,使方法區(qū)別于變量和其他內(nèi)容。在Java 的源代碼清單中,我們會遵循Java 社區(qū)最常用的編碼約定。類名以大寫字母開頭;變量名和方法名用小寫字母開頭。常量名中的所有字母都采用大寫。對于很長的名字,我們不用下劃線來分隔單詞;而是按照通常的做法,將( 第一個單詞之后的) 各個單詞的首字母大寫,并把這些單詞連在一起。例如,thisIsAVariable,thisIsAMethod(), ThisIsAClass 和THIS_IS_A_CONSTANT。另外要注意,談到靜態(tài)和非靜態(tài)方法時,我們會加以區(qū)分。與其他書不同,我們不會寫Foo.bar() 來表示Foo的bar() 方法,除非bar() 是一個靜態(tài)方法( 在此情況下,這與Java 語法一致)。
使用代碼示例
如果使用代碼示例有任何技術(shù)問題,可以向bookquestions@oreilly.com 發(fā)送E-mail。本書的目的是幫助你完成工作。一般來講,如果書中提供了示例代碼,你可以在你的程序和文檔中使用這些示例代碼,不需要聯(lián)系我們來得到許可,除非你直接復(fù)制了大部分的示例代碼。例如,如果你在編寫一個程序,使用了本書中的多段代碼,這并不需要得到許可;但是出售或發(fā)行OReilly 書中示例代碼的光盤則需要得到許可。
如果你回答問題時引用了本書的文字和示例代碼,這不需要得到許可;但是如果你的產(chǎn)品的文檔借用了本書中的大量示例代碼,則需要得到許可。
我們希望但不嚴(yán)格要求標(biāo)明引用出處。引用信息通常包括書名、作者名、出版商和ISBN。例如,Learning Java, Fifth Edition, by Marc Loy, Patrick Niemeyer,and Daniel Leuck (OReilly). Copyright 2020 Marc Loy, Patrick Niemeyer, and Daniel Leuck, 978-1-492-05627-0。
如果認(rèn)為你在使用示例代碼或其他內(nèi)容時超出了合理使用的范圍或者上述許可范圍,可以隨時聯(lián)系我們:permissions@oreilly.com。
OReilly 在線學(xué)習(xí)平臺(OReilly Online Learning)
近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網(wǎng)絡(luò),他們通過圖書、文章、會議和我們的在線學(xué)習(xí)平臺分享他們的知識和經(jīng)驗。OReilly 的在線學(xué)習(xí)平臺允許你按需訪問現(xiàn)場培訓(xùn)課程、深入的學(xué)習(xí)路徑、交互式編程環(huán)境,以及OReilly 和200 多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請訪問http://oreilly.com。
如何聯(lián)系我們
請把對本書的評價和問題發(fā)給出版社。
美國:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
針對本書,我們還創(chuàng)建了一個網(wǎng)頁,列出了有關(guān)勘誤信息和其他信息。你可以通過以下地址訪問這個頁面:https://oreil.ly/Java_5e。
Marc Loy是一位專注用戶體驗設(shè)計和移動應(yīng)用的軟件開發(fā)人員和培訓(xùn)師。
Patrick Niemeyer是網(wǎng)絡(luò)和分布式應(yīng)用領(lǐng)域的一位獨立顧問和作者。
Daniel Leuckis是Ikayzo公司的CEO,這是以東京和檀香山為基地的一個交互式設(shè)計和軟件開發(fā)公司,其客戶包括Sony、Oracle和PIMCO。
目錄
前言 .1
第1 章 一種現(xiàn)代語言 9
1.1 進入Java 世界 .10
1.1.1 Java 起源 10
1.1.2 成長 .12
1.2 虛擬機 13
1.3 Java 與其他語言的比較 15
1.4 設(shè)計安全 .19
1.4.1 簡化、簡化、再簡化19
1.4.2 類型安全和方法綁定20
1.4.3 增量式開發(fā) .21
1.4.4 動態(tài)內(nèi)存管理 .22
1.4.5 錯誤處理 23
1.4.6 線程 .23
1.4.7 可伸縮性 24
1.5 實現(xiàn)安全 .24
1.5.1 校驗器 26
1.5.2 類加載器 27
1.5.3 安全管理器 .28
1.6 應(yīng)用和用戶級安全 .28
1.7 Java 路線圖 29
1.7.1 過去:Java 1.0Java 11 29
1.7.2 現(xiàn)在:Java 14 32
1.7.3 將來 .33
1.7.4 可用性 34
第2 章 個應(yīng)用 .35
2.1 Java 工具和環(huán)境 35
2.1.1 安裝JDK 36
2.1.2 在Linux 上安裝OpenJDK 37
2.1.3 在macOS 上安裝OpenJDK 38
2.1.4 在Windows 上安裝OpenJDK 39
2.1.5 配置IntelliJ IDEA 并創(chuàng)建一個項目 43
2.1.6 運行項目 46
2.1.7 獲得本書示例 .47
2.2 HelloJava .48
2.2.1 類 .51
2.2.2 main() 方法 .52
2.2.3 類和對象 54
2.2.4 變量和類類型 .54
2.2.5 HelloComponent 55
2.2.6 繼承 .56
2.2.7 JComponent 類 57
2.2.8 關(guān)系和指向 .58
2.2.9 包和導(dǎo)入 59
2.2.10 paintComponent() 方法 61
2.3 HelloJava2: 續(xù)集 .62
2.3.1 實例變量 63
2.3.2 構(gòu)造器 64
2.3.3 事件 .66
2.3.4 repaint() 方法 .69
2.3.5 接口 .69
2.4 既是結(jié)束,又是開始 71
第3 章 專業(yè)工具 72
3.1 JDK 環(huán)境 .72
3.2 JVM 73
3.3 運行Java 應(yīng)用 .73
系統(tǒng)屬性 75
3.4 類路徑 76
3.4.1 javap 77
3.4.2 模塊 .78
3.5 Java 編譯器 78
3.6 嘗試Java .80
3.7 JAR 文件 .86
3.7.1 文件壓縮 86
3.7.2 jar 工具 87
3.7.3 pack200 工具 90
3.8 再接再厲 .91
第4 章 Java 語言 92
4.1 文本編碼 .93
4.2 注釋 95
Javadoc 注釋 96
4.3 變量和常量 98
4.4 類型 99
4.4.1 基本類型 100
4.4.2 引用類型 105
4.4.3 推導(dǎo)類型 106
4.4.4 傳遞引用 107
4.4.5 談?wù)勛址?108
4.5 語句和表達式 .109
4.5.1 語句 109
4.5.2 表達式 .118
4.6 數(shù)組 .124
4.6.1 數(shù)組類型 125
4.6.2 數(shù)組創(chuàng)建和初始化 126
4.6.3 使用數(shù)組 128
4.6.4 匿名數(shù)組 130
4.6.5 多維數(shù)組 130
4.7 類型、類和數(shù)組 132
第5 章 Java 中的對象. 134
5.1 類 .135
5.1.1 聲明和實例化類 .136
5.1.2 訪問字段和方法 .138
5.1.3 靜態(tài)成員 143
5.2 方法 .146
5.2.1 局部變量 147
.2.2 遮蔽 147
5.2.3 靜態(tài)方法 149
5.2.4 初始化局部變量 .151
5.2.5 參數(shù)傳遞和引用 .152
5.2.6 基本類型的包裝器 154
5.2.7 方法重載 156
5.3 對象創(chuàng)建 157
5.3.1 構(gòu)造器 .158
5.3.2 使用重載構(gòu)造器 .159
5.4 對象析構(gòu) 161
垃圾回收 161
5.5 包 .162
5.5.1 導(dǎo)入類 .163
5.5.2 自定義包 165
5.5.3 成員可見性和訪問 166
5.5.4 用包編譯 168
5.6 高級類設(shè)計 .169
5.6.1 派生子類和繼承 .169
5.6.2 接口 174
5.6.3 內(nèi)部類 .177
5.6.4 匿名內(nèi)部類 179
5.7 組織內(nèi)容和為失敗做規(guī)劃 180
第6 章 錯誤處理和日志 . 183
6.1 異常 .184
6.1.1 異常和錯誤類 184
6.1.2 異常處理 186
6.1.3 冒泡 190
6.1.4 棧軌跡 .191
6.1.5 受查和非受查異常 192
6.1.6 拋出異常 193
6.1.7 try 蔓延 196
6.1.8 finally 子句 197
6.1.9 帶資源的try 語句 199
6.1.10 性能問題 .200
6.2 斷言 .201
6.2.1 啟用和禁用斷言 .202
6.2.2 使用斷言 202
6.3 日志API204
6.3.1 日志API 概述 .204
6.3.2 日志級別 206
6.3.3 一個簡單的例子 .207
6.3.4 日志設(shè)置屬性 208
6.3.5 日志記錄器 210
6.3.6 性能 210
6.4 真實世界的異常 211
第7 章 集合和泛型 212
7.1 集合 .212
7.1.1 Collection 接口 213
7.1.2 集合類型 214
7.1.3 Map 接口 216
7.2 類型限制 218
7.2.1 容器 219
7.2.2 容器能固定嗎? .220
7.3 引入泛型 221
談?wù)勵愋?224
7.4 沒有勺子 .225
7.4.1 擦除 225
7.4.2 原始類型 227
7.5 參數(shù)化類型關(guān)系 228
為什么是List 而不是List