本書清晰地介紹了面向對象的編程概念、語言基礎、類和對象、接口和繼承、泛型、包、數字和字符串、異常、集合等內容,同時涵蓋了JavaSE7的新特性,比如NIO.2的內容等。每章的后面都有問題和練習,幫助讀者鞏固所學知識,學以致用。此外,本書的附錄中還給出如何準備Java編程語言認證考試方面的內容。
The Java Tutorial:A Short Course on the Basics自2010年年初Oracle公司收購Sun公司以來,Java語言迎來了激動人心的時代。正如Java Community Process(JCP)計劃的活動所印證的,Java語言將不斷發展。本書基于Java SE 7版本并引用該版本的API。
相比本書第4版(針對的是Java版本6),第5版引入了一些新的特性,如關于NIO.2的內容、新的文件I/O API和將遺留代碼遷移到這些新API的相關信息。部署部分擴展成第18章和第19章。Fork/Join特性部分添加到第12章。項目Coin的開發也已添加到合適的章節,包括新的try-with-resources語句、單個異常處理器捕獲多種類型異常的能力、二進制字符串的支持,以及引入簡潔泛型代碼的diamond語法。
除這些新特性外,本書的前面章節也進行了重寫,增加了一些新的信息。例如,更新第6章、第16章和第17章的內容,替換附錄中Java認證考試的內容。
如果你準備參加Java SE 7認證考試,本書可提供一定的幫助。附錄中列出三個級別的考試,詳細介紹每個級別考試覆蓋的項目,并指出書中涉及相關信息的章節及有價值的參考資料。注意,這只是參加認證考試要準備的眾多內容之一。
所有內容都由Oracle Java engineering的成員審校過,以確保書中信息都是正確和最新的。本書也被置于Oracle網站的在線教程內,其網址如下:http://docs.oracle.com/javase/tutorial。
本書內容被視為Java的核心教程,是初學者和中級程序員的必學知識。只要掌握這些內容就可以研究網站上Java平臺文檔的其余部分。如果你有興趣開發復雜的富互聯網應用(RIA),可以查看最前沿的Java圖形用戶界面(GUI)工具包JavaFX。
正如發布的Java SE 7 update 5所述,下載JDK時可以自動獲取JavaFX軟件開發包(SDK)。要獲取更多信息可查看JavaFX文檔,其網址如下: http://docs.oracle.com/javafx。
和以前的版本一樣,本書的目的是編寫一個易于閱讀的實用程序員指南,以協助讀者學習使用Java提供的豐富的環境構建應用程序、applet和組件。讓我們繼續學習編程吧!
讀者對象本書同時面向新手和有經驗的程序員。
新手通讀本書(包括第1章中編譯和運行第一個程序的每一步指令)將有最大的收獲。
有經驗的過程式語言程序員(如C語言)可以從面向對象的概念和Java程序語言的特性開始學習。
有經驗的程序員可以直接學習高級主題,如泛型、并發和部署等。
本書內容適用于不同層次的程序員學習。
如何使用本書本書可直接從頭讀到尾或忽略某些主題跳到另一個主題。這些信息的組織有一定的邏輯順序,且盡可能忽略一些參考文獻。
本書例子都在JDK 7 版本中編譯。讀者要下載該版本或更新的版本來編譯和運行實例。
本書對引用的一些材料提供了在線幫助(如可下載的實例、問題和練習的答案、JDK 7手冊和API規范),其鏈接在文中以腳注形式給出,例如:7/docs/api/java/lang/Class.html和tutorial/java/generics/examples/BoxDemo.java。
Java教程也提供了兩種格式的電子書:
移動電子書文件,適用于Kindle。
ePub電子書文件,適用于iPad、Nook和其他支持ePub格式的設備。
每本電子書包含唯一的路徑,對應本書的相關章節。讀者可通過Java教程主頁上的鏈接“In Book Form”下載電子書:http://docs.oracle.com/javase/tutorial/index.html。
歡迎讀者給我們反饋,請通過下述教程反饋頁面聯系我們: http://docs.oracle.com/javase/feedback.html。
如果沒有Oracle Java engineering團隊不知疲倦地檢查本書的技術內容,本書將不能面世。本書第5版的推出,要特別感謝Alan Bateman、Alex Buckley、Calvin Cheung、Maurizio Cimadamore、Joe Darcy、Andy Herrick、Stuart Marks、Igor Nekrestyanov、Thomas Ng、Nam Nguyen和Daniel Smith。
Jordan Douglas和Dawn Tyler快速高效地創建了本書中專業的插圖。Devika Gollapudi為書中的截屏圖提供了有價值的幫助。
編輯Deborah Owens和Susan Shepard仔細完整地對書稿進行了編輯加工。
感謝團隊成員Bhavesh Patel、Devika Gollapudi和Santhosh La的支持。
最后要感謝Alan Sommerer、Barbara Ramsey、Sophia Mikulinsky和Sowmya Kannan等管理人員的支持。
出版者的話
譯者序
前言
第1 章 快速入門
1.1 關于Java 技術
1.1.1 Java 程序語言
1.1.2 Java 平臺
1.1.3 Java 技術的功能
1.1.4 Java 技術的優勢
1.2 "Hello World!"實例程序
1.2.1 用NetBeans IDE 開發"Hello World !"
1.2.2 在Microsoft Windows 中開發"Hello World !"
1.2.3 在Solaris 和Linux 中開發"Hello World !"
1.3 "Hello World !"實例程序剖析
1.3.1 源碼注釋
1.3.2 HelloWorldApp 類定義
1.3.3 main 方法
1.4 常見問題(及其解決方案)
1.4.1 編譯器問題
1.4.2 運行時問題
1.5 問題和練習:快速入門
第2 章 面向對象的編程概念
2.1 對象
2.2 類
2.3 繼承
2.4 接口
2.5 包
2.6 問題和練習:面向對象的編程概念
第3 章 語言基礎
3.1 變量
3.1.1 命名
3.1.2 基本數據類型
3.1.3 數組
3.1.4 小結
3.1.5 問題和練習:變量
3.2 運算符
3.2.1 賦值運算符、算術運算符和一元運算符
3.2.2 等式運算符、關系運算符和條件運算符
3.2.3 位運算符和移位運算符
3.2.4 小結
3.2.5 問題和練習:運算符
3.3 表達式、語句和塊
3.3.1 表達式
3.3.2 語句
3.3.3 塊
3.3.4 問題和練習:表達式、語句和塊
3.4 控制流語句
3.4.1 if-then 語句和if-then-else語句
3.4.2 switch 語句
3.4.3 while 語句和do-while 語句
3.4.4 for 語句
3.4.5 分支語句
3.4.6 小結
3.4.7 問題和練習:控制流語句
第4 章 類和對象
4.1 類
4.1.1 聲明類
4.1.2 聲明成員變量
4.1.3 定義方法
4.1.4 構建構造器
4.1.5 將消息傳給方法或構造器
4.2 對象
4.2.1 創建對象
4.2.2 使用對象
4.3 類的更多細節
4.3.1 從方法返回值
4.3.2 使用this 關鍵字
4.3.3 控制對類成員的訪問
4.3.4 實例和類成員
4.3.5 初始化字段
4.3.6 小結
4.3.7 問題和練習:類
4.3.8 問題和練習:對象
4.4 嵌套類
4.4.1 為什么使用嵌套類
4.4.2 靜態嵌套類
4.4.3 內部類
4.4.4 內部類實例
4.4.5 小結
4.4.6 問題和練習:嵌套類
4.5 枚舉類型
4.5.1 問題和練習:枚舉類型
4.6 注解
4.6.1 文檔
4.6.2 編譯器使用的注解
4.6.3 注解的處理
4.6.4 問題和練習:注解
第5 章 接口與繼承
5.1 接口
5.1.1 Java 語言的接口
5.1.2 將接口用作API
5.1.3 接口和多重繼承
5.1.4 定義接口
5.1.5 實現接口
5.1.6 將接口用作類型
5.1.7 重寫接口
5.1.8 小結
5.1.9 問題和練習:接口
5.2 繼承
5.2.1 Java 平臺中類的層次結構
5.2.2 繼承實例
5.2.3 子類能做什么
5.2.4 超類的私有成員
5.2.5 轉換對象
5.2.6 覆蓋和屏蔽方法
5.2.7 多態性
5.2.8 屏蔽字段
5.2.9 使用super 關鍵字
5.2.10 將對象用作超類
5.2.11 編寫final 類和方法
5.2.12 抽象方法和類
5.2.13 小結
5.2.14 問題和練習:繼承
第6 章 泛型
6.1 為什么用泛型
6.2 泛型類型
6.2.1 一個簡單的Box 類
6.2.2 Box 類的泛型版本
6.2.3 類型參數命名約定
6.2.4 泛型類型的調用和實例化
6.2.5 鉆石運算符
6.2.6 多個類型參數
6.2.7 參數化類型
6.2.8 原生類型
6.3 泛型方法
6.4 受限類型形式參數
6.4.1 多重限制
6.4.2 泛型方法和受限類型形式參數
6.5 泛型、繼承和子類型
6.5.1 泛型類和子類型
6.6 類型推導
6.6.1 類型推導和泛型方法
6.6.2 類型推導和泛型類的實例化
6.6.3 類型推導與泛型類和非泛型類的泛型構造函數
6.7 通配符
6.7.1 上界通配符
6.7.2 界通配符
6.7.3 下界通配符
6.7.4 通配符和子類型
6.7.5 通配符匹配和輔助方法
6.7.6 通配符使用指南
6.8 類型擦除
6.8.1 泛型類型的擦除
6.8.2 泛型方法的擦除
6.8.3 類型擦除效果和橋方法
6.8.4 不可具體化類型
6.9 泛型的局限性
6.9.1 不能用基本數據類型實例化泛型類型
6.9.2 不能創建類型參數實例
6.9.3 不能聲明類型為"類型參數"的靜態字段
6.9.4 對參數化類型不能用類型轉換或instanceof 運算符
6.9.5 不能創建參數化類型數組
6.9.6 不能創建、捕獲或拋出參數化類型的對象
6.9.7 每次重載時其形式參數類型都被擦為相同的原生類型的方法不能重載
6.10 問題和練習:泛型
第7 章 程序包
7.1 程序包的創建
7.2 程序包的命名
7.2.1 命名約定
7.3 程序包成員的使用
7.3.1 用完全限定名指代程序包成員
7.3.2 導入包成員
7.3.3 導入整個程序包
7.3.4 包的表面層次結構
7.3.5 命名歧義性
7.3.6 靜態import 語句
7.4 源文件和類文件的管理
7.4.1 設置CLASSPATH 系統變量
7.5 小結
7.6 問題和練習:創建和使用包
第8 章 數字和字符串
8.1 數字
8.1.1 Number 類
8.1.2 格式化數字打印輸出
8.1.3 其他數學運算方法
8.1.4 自動裝箱和拆箱
8.1.5 小結
8.1.6 問題和練習:數字
8.2 字符
8.2.1 轉義字符
8.3 字符串
8.3.1 創建字符串
8.3.2 字符串長度
8.3.3 字符串連接
8.3.4 創建格式字符串
8.3.5 數字和字符串之間的轉換
8.3.6 操作字符串中的字符
8.3.7 比較字符串和字符串的子串
8.3.8 StringBuilder 類
8.3.9 小結
8.3.10 問題和練習:字符和字符串
第9 章 異常
9.1 什么是異常
9.2 捕獲或指明規定
9.2.1 三類異常
9.2.2 繞過捕獲或指明
9.3 捕獲和處理異常
9.3.1 try 塊
9.3.2 catch 塊
9.3.3 finally 塊
9.3.4 try-with-resources 語句
9.3.5 匯總
9.4 指明一個方法拋出的異常
9.5 如何拋出異常
9.5.1 throw 語句
9.5.2 Throwable 類及其子類
9.5.3 Error 類
9.5.4 Exception 類
9.5.5 鏈式異常
9.5.6 創建異常類
9.6 未檢查異常:爭議
9.7 異常的優點
9.7.1 優點1:把錯誤處理代碼和"正規"代碼分離開
9.7.2 優點2:根據調用棧上傳錯誤
9.7.3 優點3:對錯誤類型進行分組和加以區分
9.8 小結
9.9 問題和練習:異常
第10 章 基本I/O 和NIO.2
10.1 I/O 流
10.1.1 字節流
10.1.2 字符流
10.1.3 緩沖流
10.1.4 掃描和格式化
10.1.5 命令行I/O
10.1.6 數據流
10.1.7 對象流
10.2 文件I/O(以NIO.2 為特征)
10.2.1 什么是路徑(以及其他文件系統情況)
10.2.2 Path 類
10.2.3 文件操作
10.2.4 檢查文件或目錄
10.2.5 刪除文件或目錄
10.2.6 復制文件或目錄
10.2.7 移動文件或目錄
10.2.8 管理元數據(文件和文件存儲屬性)
10.2.9 讀取、寫入和創建文件
10.2.10 隨機存取文件
10.2.11 創建和讀取目錄
10.2.12 符號鏈接或其他方式的鏈接
10.2.13 遍歷文件樹
10.2.14 查找文件
10.2.15 監視目錄的變化
10.2.16 其他有用的方法
10.2.17 遺留文件的 I/O 代碼
10.3 小結
10.4 問題和練習:基本I/O 和 NIO.2
第11 章 集合
11.1 集合簡介
11.1.1 集合框架是什么
11.1.2 Java 集合框架的好處
11.2 接口
11.2.1 Collection 接口
11.2.2 遍歷集合
11.2.3 Collection 接口的批量操作
11.2.4 Collection 接口的數組操作
11.2.5 Set 接口
11.2.6 List 接口
11.2.7 Queue 接口
11.2.8 Map 接口
11.2.9 對象排序
11.2.10 SortedSet 接口
11.2.11 SortedMap 接口
11.2.12 小結
11.2.13 問題和練習:接口
11.3 實現
11.3.1 Set 實現
11.3.2 List 實現
11.3.3 Map 實現
11.3.4 Queue 實現
11.3.5 封裝實現
11.3.6 簡單實現
11.3.7 小結
11.3.8 問題和練習:實現
11.4 算法
11.4.1 排序
11.4.2 混排
11.4.3 常規數據操作
11.4.4 查詢
11.4.5 組合
11.4.6 查找極值
11.5 自定義集合實現
11.5.1 編寫實現的原因
11.5.2 如何編寫自定義實現
11.6 互操作性
11.6.1 兼容性
11.6.2 API 設計
第12 章 并發
12.1 進程和線程
12.1.1 進程
12.1.2 線程
12.2 線程對象
12.2.1 定義和啟動一個線程
12.2.2 使用sleep 方法暫停執行
12.2.3 中斷
12.2.4 聯合
12.2.5 SimpleThreads 實例
12.3 同步
12.3.1 線程沖突
12.3.2 內存一致性錯誤
12.3.3 同步方法
12.3.4 內部鎖和同步
12.3.5 原子訪問
12.4 活性
12.4.1 死鎖
12.4.2 饑餓和活鎖
12.5 保護塊
12.6 不可變對象
12.6.1 同步類實例
12.6.2 定義不可變對象的一種策略
12.7 高級并發對象
12.7.1 鎖對象
12.7.2 執行器
12.7.3 并發集合
12.7.4 原子變量
12.7.5 并發隨機數
12.8 問題和練習:并發
第13 章 正則表達式
13.1 簡介
13.1.1 什么是正則表達式
13.1.2 包中的正則表達式如何表示
13.2 測試工具
13.3 字符串文字
13.3.1 元字符
13.4 字符類
13.4.1 簡單類
13.5 預定義字符類
13.6 量詞
13.6.1 零長度匹配
13.6.2 捕捉組和擁有量詞的字符類
13.6.3 貪婪型、勉強型和占有型量詞之間的區別
13.7 捕捉組
13.7.1 編號
13.7.2 反向引用
13.8 邊界匹配器
13.9 模式類方法
13.9.1 使用標記創建模式
13.9.2 嵌套標記表達式
13.9.3 使用matches (String,CharSequence) 方法
13.9.4 使用split (String) 方法
13.9.5 其他實用方法
13.9.6 java.lang.String 中模式方法的等價
13.10 匹配類方法
13.10.1 索引方法
13.10.2 學習方法
13.10.3 替換方法
13.10.4 使用start 和end 方法
13.10.5 使用matches 和lookingAt方法
13.10.6 使用replaceFirst (String)和replaceAll (String)
13.10.7 使用appendReplacement(StringBuffer, String) 和appendTail (StringBuffer)
13.10.8 Matcher 方法在java.lang.String中的等價
13.11 模式語法異常類方法
13.12 Unicode 支持
13.12.1 匹配特定代碼點
13.12.2 Unicode 字符屬性
13.13 附加資源
13.14 問題和練習:正則表達式
第14 章 平臺環境
14.1 配置工具
14.1.1 屬性
14.1.2 命令行參數
14.1.3 環境變量
14.1.4 其他配置工具
14.2 系統工具
14.2.1 命令行I/O 對象
14.2.2 系統屬性
14.2.3 安全管理器
14.2.4 系統的其他方法
14.3 路徑和類路徑
14.3.1 更新PATH 環境變量(Microsoft Windows)
14.3.2 更新PATH 變量(Solaris 和Linux)
14.3.3 檢查CLASSPATH 變量(所有平臺)
14.4 問題和練習:平臺環境
第15 章 JAR 文件
15.1 JAR 文件使用入門
15.1.1 創建JAR 文件
15.1.2 查看JAR 文件內容
15.1.3 抽取JAR 文件內容
15.1.4 更新JAR 文件
15.1.5 運行打包為JAR 的軟件
15.2 清單文件使用入門
15.2.1 理解默認的清單文件
15.2.2 修改清單文件
15.2.3 設置應用程序的入口點
15.2.4 將類文件加入JAR 文件的類路徑
15.2.5 設置包版本信息
15.2.6 用JAR 文件封裝包
15.2.7 封裝JAR 文件
15.3 JAR 文件的簽名和驗證
15.3.1 理解簽名和驗證
15.3.2 對JAR 文件簽名
15.3.3 驗證簽名的JAR 文件
15.4 使用JAR 相關API
15.4.1 實例:JarRunner 應用
15.5 問題:JAR 文件
第16 章 Java Web Start
16.1 開發Java Web Start 應用程序
16.1.1 創建頂層JPanel 類
16.1.2 創建應用程序
16.1.3 從最后部署機制中分離出核心方法的好處
16.1.4 獲取資源
16.2 部署Java Web Start 應用
16.2.1 設置Web 服務器
16.3 顯示自定義的加載進度指示器
16.3.1 開發自定義的加載進度指示器
16.3.2 為Java Web Start 應用指定自定義的加載進度指示器
16.4 運行Java Web Start 應用
16.4.1 通過瀏覽器運行Java Web Start 應用
16.4.2 通過Java Cache Viewer 運行Java Web Start 應用
16.4.3 從桌面運行Java Web Start 應用
16.5 Java Web Start 與安全
16.5.1 動態下載HTTPS 認證
16.6 Java Web Start 常見問題
16.7 問題和練習:Java Web Start
第17 章 applet
17.1 開始使用applet
17.1.1 定義Applet 類的子類
17.1.2 Milestones 方法
17.1.3 applet 的生命周期
17.1.4 applet 執行環境
17.1.5 開發applet
17.1.6 部署applet
17.2 applet 更多功能
17.2.1 查找和加載數據文件
17.2.2 定義和使用applet 參數
17.2.3 顯示簡短的狀態字符串
17.2.4 在瀏覽器中顯示文檔
17.2.5 從applet 調用JavaScript代碼
17.2.6 從JavaScript 代碼中調用applet 方法
17.2.7 通過事件句柄處理初始化狀態
17.2.8 操縱applet 網頁的DOM
17.3 顯示自定義的加載進度指示器
17.3.1 開發自定義的加載進度指示器
17.3.2 為applet 指定加載進度指示器
17.3.3 將加載進度指示器和applet 用戶界面結合
17.3.4 將診斷寫入標準輸出和錯誤流
17.3.5 開發可拖動的applet
17.3.6 和其他applet 交互
17.3.7 與服務器端應用交互
17.3.8 applet 能做什么和不能做什么
17.4 applet 常見問題及解決方案
17.5 問題和練習:applet
第18 章 Java 富互聯網應用系統
18.1 設置可信參數和安全屬性
18.1.1 系統屬性
18.2 JNLP API
18.2.1 通過JNLP API 獲取客戶端
18.3 cookie
18.3.1 cookie 的類型
18.3.2 RIA 中的cookie 支持
18.3.3 獲取cookie
18.4 自定義加載體驗
18.5 RIA 中的安全
18.6 問題和練習:Java 富互聯網應用系統
第19 章 深入理解部署
19.1 部署工具
19.1.1 部署工具腳本所在位置
19.1.2 部署applet
19.1.3 部署Java Web Start 應用
19.1.4 檢查客戶端的JRE 軟件版本
19.2 Java 網絡加載協議
19.2.1 JNLP 文件結構
19.3 部署的最佳實踐
19.3.1 減少下載時間
19.3.2 避免不必要的更新檢查
19.3.3 只有必要時才簽名JAR文件
19.3.4 確保JRE 軟件存在
19.4 問題和練習:深入理解部署
附錄 Java 程序語言認證考試復習大綱