本書是《瘋狂Java講義》第6版的上冊,第6版保持了前5版系統(tǒng)、全面、講解淺顯、細(xì)致的特性,全面新增介紹了Java 12到Java 17的新特性。《瘋狂Java講義》第6版深入介紹了Java編程的相關(guān)方面,上、下冊內(nèi)容覆蓋了Java的基本語法結(jié)構(gòu)、Java的面向?qū)ο筇卣、Java集合框架體系、Java泛型、異常處理、Java GUI編程、JDBC數(shù)據(jù)庫編程、Java注釋、Java的IO流體系、Java多線程編程、Java網(wǎng)絡(luò)通信編程和Java反射機(jī)制,覆蓋了java.lang、java.util、java.text、java.io和java.nio、java.sql、java.awt、javax.swing包下絕大部分的類和接口。第6版重點(diǎn)介紹了Java的模塊化系統(tǒng),還詳細(xì)介紹了Java 12到Java 17引入的塊字符串,instanceof的模式匹配,增強(qiáng)型switch語句、switch表達(dá)式及模式匹配,密封類,Record類,以及Java 12到Java 17新增的各種API功能。與前5版類似,第6版并不單純地從知識(shí)角度來講解Java,而是從解決問題的角度來介紹Java語言,所以涉及大量實(shí)用案例開發(fā):五子棋游戲、梭哈游戲、仿QQ的游戲大廳、MySQL企業(yè)管理器、仿EditPlus的文本編輯器、多線程、斷點(diǎn)下載工具、Spring框架的IoC容器……這些案例既能讓讀者鞏固每章所學(xué)的知識(shí),又可以讓讀者學(xué)以致用,激發(fā)編程自豪感,進(jìn)而引爆內(nèi)心的編程激情。第6版相關(guān)資料包中包含書中所有示例的代碼和《瘋狂Java實(shí)戰(zhàn)演義》的所有項(xiàng)目代碼,這些項(xiàng)目可以作為本書課后練習(xí)題的“非標(biāo)準(zhǔn)答案”。如果讀者需要獲取關(guān)于課后練習(xí)題的解決方法、編程思路,可關(guān)注“瘋狂講義”微信服務(wù)號(hào),加入讀者微信群后,與作者及本書龐大的讀者群相互交流。《瘋狂Java講義》為所有打算深入掌握J(rèn)ava編程的讀者而編寫,適合各種層次的Java學(xué)習(xí)者和工作者閱讀,也適合作為大專院校、培訓(xùn)機(jī)構(gòu)的Java教材。
李剛,十余年軟件開發(fā)從業(yè)經(jīng)驗(yàn),瘋狂軟件教育中心教學(xué)總監(jiān)。瘋狂Java實(shí)訓(xùn)營創(chuàng)始人,瘋狂Java體系原創(chuàng)圖書作者。廣東技術(shù)師范學(xué)院計(jì)算機(jī)科學(xué)系兼職副教授,CSDN特邀講師。培訓(xùn)的學(xué)生已在騰訊、阿里、華為、IBM、網(wǎng)易、唯品會(huì)、電信盈科等名企就職。國內(nèi)知名高端IT技術(shù)圖書作家,已出版《瘋狂Java講義》《瘋狂Spring Boot終極講義》《瘋狂Android講義》《輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn)》《瘋狂前端開發(fā)講義》《瘋狂HTML5/CSS3/講義》等著作。其中瘋狂Java體系圖書均已沉淀多年,贏得極高的市場認(rèn)同,多次重印,多部著作印刷數(shù)量超過10萬冊,并被多所“985”“211”院校選作教材,部分圖書已被翻譯成繁體中文版,授權(quán)到寶島臺(tái)灣。
第1章 Java語言概述與開發(fā)環(huán)境
1.1 Java語言的發(fā)展簡史
1.2 Java程序運(yùn)行機(jī)制
1.2.1 高級(jí)語言的運(yùn)行機(jī)制
1.2.2 Java程序的運(yùn)行機(jī)制和JVM
1.3 開發(fā)Java程序的準(zhǔn)備
1.3.1 下載和安裝Java 17的JDK
不是說JVM是運(yùn)行Java程序的虛擬機(jī)嗎?那JRE和JVM的關(guān)系是怎樣的呢?
1.3.2 JDK 17增強(qiáng)的安裝器與PATH環(huán)境變量
為什么選擇用戶變量?用戶變量與系統(tǒng)變量有什么區(qū)別?
1.4 第一個(gè)Java程序
1.4.1 編輯Java源代碼
1.4.2 編譯Java程序
當(dāng)編譯C程序時(shí),不僅需要指定存放目標(biāo)文件的位置,而且需要指定目標(biāo)文件的文件名,這里使用javac編譯Java程序時(shí)怎么不需要指定目標(biāo)文件的文件名呢?
1.4.3 運(yùn)行Java程序
1.4.4 根據(jù)CLASSPATH環(huán)境變量定位類
1.5 Java程序的基本規(guī)則
1.5.1 Java程序的組織形式
1.5.2 Java源文件的命名規(guī)則
1.5.3 初學(xué)者容易犯的錯(cuò)誤
1.6 交互式工具:jshell
1.7 Java 17改進(jìn)的垃圾回收器
1.8 何時(shí)開始使用IDE工具
我想學(xué)習(xí)Java編程,到底是學(xué)習(xí)Eclipse好,還是學(xué)習(xí)IntelliJ IDEA好呢?
1.9 本章小結(jié)
本章練習(xí)
第2章 理解面向?qū)ο?
2.1 面向?qū)ο?
2.1.1 結(jié)構(gòu)化程序設(shè)計(jì)簡介
2.1.2 程序的三種基本結(jié)構(gòu)
2.1.3 面向?qū)ο蟪绦蛟O(shè)計(jì)簡介
2.1.4 面向?qū)ο蟮幕咎卣?
2.2 UML介紹
2.2.1 用例圖
2.2.2 類圖
2.2.3 組件圖
2.2.4 部署圖
2.2.5 順序圖
2.2.6 活動(dòng)圖
2.2.7 狀態(tài)機(jī)圖
2.3 Java的面向?qū)ο筇卣?
2.3.1 一切都是對象
2.3.2 類和對象
2.4 本章小結(jié)
第3章 數(shù)據(jù)類型和運(yùn)算符
3.1 注釋
3.1.1 單行注釋和多行注釋
3.1.2 文檔注釋
API文檔是什么?
為什么要學(xué)習(xí)查看API文檔的方法?
3.2 變量與數(shù)據(jù)類型分類
什么是變量?變量有什么用?
3.3 標(biāo)識(shí)符和關(guān)鍵字
3.3.1 分隔符
3.3.2 標(biāo)識(shí)符規(guī)則
3.3.3 Java關(guān)鍵字
3.4 基本數(shù)據(jù)類型
3.4.1 整型
3.4.2 字符型
什么是字符集?
3.4.3 浮點(diǎn)型
3.4.4 在數(shù)值中使用下畫線分隔
3.4.5 布爾型
3.4.6 使用var定義變量
3.5 基本類型的類型轉(zhuǎn)換
3.5.1 自動(dòng)類型轉(zhuǎn)換
3.5.2 強(qiáng)制類型轉(zhuǎn)換
3.5.3 表達(dá)式類型的自動(dòng)提升
3.6 直接量
3.6.1 直接量的類型
3.6.2 直接量的賦值
3.6.3 Java 17增加的塊字符串
3.7 運(yùn)算符
3.7.1 算術(shù)運(yùn)算符
3.7.2 賦值運(yùn)算符
3.7.3 位運(yùn)算符
3.7.4 擴(kuò)展后的賦值運(yùn)算符
3.7.5 比較運(yùn)算符
3.7.6 邏輯運(yùn)算符
3.7.7 三目運(yùn)算符
3.7.8 運(yùn)算符的結(jié)合性和優(yōu)先級(jí)
3.8 本章小結(jié)
本章練習(xí)
第4章 流程控制與數(shù)組
4.1 順序結(jié)構(gòu)
4.2 分支結(jié)構(gòu)
4.2.1 if條件語句
4.2.2 傳統(tǒng)switch分支語句
4.2.3 Java 17的新式switch語句
4.2.4 Java 17新增的switch表達(dá)式
4.3 循環(huán)結(jié)構(gòu)
4.3.1 while循環(huán)語句
4.3.2 do while循環(huán)語句
4.3.3 for循環(huán)
4.3.4 嵌套循環(huán)
4.4 控制循環(huán)結(jié)構(gòu)
4.4.1 使用break結(jié)束循環(huán)
4.4.2 使用continue忽略本次循環(huán)剩下的語句
4.4.3 使用return結(jié)束方法
4.5 數(shù)組類型
4.5.1 理解數(shù)組:數(shù)組也是一種類型
int[]是一種數(shù)據(jù)類型嗎?怎么使用這種類型呢?
4.5.2 定義數(shù)組
4.5.3 數(shù)組的初始化
能不能只分配內(nèi)存空間,不賦初始值呢?
4.5.4 使用數(shù)組
為什么要記住這些異常信息?
4.5.5 foreach循環(huán)
4.6 深入數(shù)組
4.6.1 內(nèi)存中的數(shù)組
為什么有棧內(nèi)存和堆內(nèi)存之分?
4.6.2 基本類型數(shù)組的初始化
4.6.3 引用類型數(shù)組的初始化
4.6.4 沒有多維數(shù)組
我是否可以讓圖4.13中灰色覆蓋的數(shù)組元素再次指向另一個(gè)數(shù)組?這樣不就可以擴(kuò)展成三維數(shù)組,甚至擴(kuò)展成更多維的數(shù)組嗎?
4.6.5 操作數(shù)組的工具類:Arrays
4.6.6 數(shù)組應(yīng)用舉例
4.7 本章小結(jié)
本章練習(xí)
第5章 面向?qū)ο螅ㄉ希?
5.1 類和對象
5.1.1 定義類
構(gòu)造器不是沒有返回值嗎?為什么不能用void聲明呢?
5.1.2 對象的產(chǎn)生和使用
5.1.3 對象、引用和指針
5.1.4 對象的this引用
5.2 方法詳解
5.2.1 方法的所屬性
5.2.2 方法的參數(shù)傳遞機(jī)制
5.2.3 形參個(gè)數(shù)可變的方法
5.2.4 遞歸方法
5.2.5 方法重載
為什么方法的返回值類型不能用于區(qū)分重載的方法?
5.3 成員變量和局部變量
5.3.1 成員變量和局部變量分類
5.3.2 成員變量的初始化和內(nèi)存中的運(yùn)行機(jī)制
5.3.3 局部變量的初始化和內(nèi)存中的運(yùn)行機(jī)制
5.3.4 變量的使用規(guī)則
5.4 隱藏和封裝
5.4.1 理解封裝
5.4.2 使用訪問控制符
5.4.3 package、import和import static
5.4.4 Java的常用包
5.5 深入構(gòu)造器
5.5.1 使用構(gòu)造器執(zhí)行初始化
構(gòu)造器是創(chuàng)建Java對象的途徑,是不是說構(gòu)造器完全負(fù)責(zé)創(chuàng)建Java對象?
5.5.2 構(gòu)造器重載
為什么要用this來調(diào)用另一個(gè)重載的構(gòu)造器?我把另一個(gè)構(gòu)造器中的代碼復(fù)制到這個(gè)構(gòu)造器中不就可以了嗎?
5.6 類的繼承
5.6.1 繼承的特點(diǎn)
5.6.2 重寫父類的方法
5.6.3 super限定
5.6.4 調(diào)用父類構(gòu)造器
為什么我在創(chuàng)建Java對象時(shí)從未感覺到j(luò)ava.lang.Object類的構(gòu)造器被調(diào)用過?
5.7 多態(tài)
5.7.1 多態(tài)性
5.7.2 引用變量的強(qiáng)制類型轉(zhuǎn)換
5.7.3 instanceof運(yùn)算符
5.7.4 Java 17為instanceof增加的模式匹配
5.7.5 Java 17為switch增加的模式匹配
5.8 繼承與組合
5.8.1 使用繼承的注意點(diǎn)
5.8.2 利用組合實(shí)現(xiàn)復(fù)用
當(dāng)使用組合關(guān)系實(shí)現(xiàn)復(fù)用時(shí),需要?jiǎng)?chuàng)建兩個(gè)Animal對象,這是不是意味著使用組合關(guān)系時(shí)系統(tǒng)開銷更大?
5.9 初始化塊
5.9.1 使用初始化塊
5.9.2 實(shí)例初始化塊和構(gòu)造器
5.9.3 類初始化塊
5.10 本章小結(jié)
本章練習(xí)
第6章 面向?qū)ο螅ㄏ拢?
6.1 包裝類
Java為什么要對這些數(shù)據(jù)進(jìn)行
緩存呢?
6.2 處理對象
6.2.1 打印對象和toString方法
6.2.2 ==和equals方法
上面程序中在判斷obj是否為Person類的實(shí)例時(shí),為何不用obj instanceof Person來判斷呢?
6.3 類成員
6.3.1 理解類成員
6.3.2 單例類
6.4 final修飾符
6.4.1 final成員變量
6.4.2 final局部變量
6.4.3 使用final修飾基本類型變量和引用
類型變量的區(qū)別
6.4.4 可執(zhí)行“宏替換”的final變量
6.4.5 final方法
6.4.6 final類
6.4.7 不可變類
6.4.8 緩存實(shí)例的不可變類
6.5 抽象類
6.5.1 抽象方法和抽象類
6.5.2 抽象類的作用
6.6 改進(jìn)后的接口
6.6.1 接口的概念
6.6.2 改進(jìn)后的接口定義
6.6.3 接口的繼承
6.6.4 使用接口
6.6.5 接口和抽象類
6.6.6 面向接口編程
6.7 內(nèi)部類
6.7.1 Java 17改進(jìn)的非靜態(tài)內(nèi)部類
非靜態(tài)內(nèi)部類對象和外部類對象的關(guān)系是怎樣的?
6.7.2 靜態(tài)內(nèi)部類
為什么靜態(tài)內(nèi)部類的實(shí)例方法也不能訪問外部類的實(shí)例變量呢?
在接口里是否可以定義內(nèi)部接口?
6.7.3 使用內(nèi)部類
既然內(nèi)部類是外部類的成員,那么是否可以為外部類定義子類,在子類中再定義一個(gè)內(nèi)部類來重寫其父類中的內(nèi)部類呢?
6.7.4 局部內(nèi)部類
6.7.5 匿名內(nèi)部類
6.8 Lambda表達(dá)式
6.8.1 Lambda表達(dá)式入門
6.8.2 Lambda表達(dá)式與函數(shù)式接口
6.8.3 在Lambda表達(dá)式中使用var
6.8.4 方法引用與構(gòu)造器引用
6.8.5 Lambda表達(dá)式與匿名內(nèi)部類的聯(lián)系和區(qū)別
6.8.6 使用Lambda表達(dá)式調(diào)用Arrays的類方法
6.9 枚舉類
6.9.1 手動(dòng)實(shí)現(xiàn)枚舉類
6.9.2 枚舉類入門
6.9.3 枚舉類的成員變量、方法和構(gòu)造器
6.9.4 實(shí)現(xiàn)接口的枚舉類
枚舉類不是用final修飾了嗎?怎么還能派生子類呢?
6.9.5 包含抽象方法的枚舉類
6.10 Java 17引入的密封類
6.10.1 密封類與其子類
6.10.2 密封類與類型轉(zhuǎn)換
6.10.3 密封接口
6.10.4 密封類與switch模式匹配
6.11 Java 17引入的Record類
6.11.1 Record類入門
6.11.2 Record類的構(gòu)造器
6.11.3 局部Record類
6.12 對象與垃圾回收
6.12.1 對象在內(nèi)存中的狀態(tài)
6.12.2 強(qiáng)制垃圾回收
6.12.3 finalize方法
6.12.4 對象的軟引用、弱引用和虛引用
6.13 修飾符的適用范圍
6.14 多版本JAR包
6.14.1 jar命令詳解
6.14.2 創(chuàng)建可執(zhí)行的JAR包
6.14.3 關(guān)于JAR包的技巧
6.15 本章小結(jié)
本章練習(xí)
第7章 Java基礎(chǔ)類庫
7.1 與用戶互動(dòng)
7.1.1 運(yùn)行Java程序的參數(shù)
7.1.2 使用Scanner獲取鍵盤輸入
7.2 系統(tǒng)相關(guān)類
7.2.1 Java 17增強(qiáng)的System類
7.2.2 Runtime類與ProcessHandle
7.3 常用類
7.3.1 Object類
7.3.2 操作對象的Objects工具類
7.3.3 使用Optional操作可空值
7.3.4 String、StringBuffer和StringBuilder類
7.3.5 Math類
7.3.6 ThreadLocalRandom與Random
7.3.7 BigDecimal類
7.4 日期、時(shí)間類
7.4.1 Date類
7.4.2 Calendar類
7.4.3 Java 17增強(qiáng)的新式日期、時(shí)間包
7.5 正則表達(dá)式
7.5.1 創(chuàng)建正則表達(dá)式
7.5.2 使用正則表達(dá)式
7.6 變量處理和方法處理
7.6.1 使用MethodHandle動(dòng)態(tài)調(diào)用方法
7.6.2 使用VarHandle動(dòng)態(tài)操作變量
7.7 國際化與格式化
7.7.1 Java國際化的思路
7.7.2 Java支持的國家和語言
7.7.3 完成程序國際化
7.7.4 使用MessageFormat處理包含占位符的字符串
7.7.5 使用類文件代替資源文件
7.7.6 Java的新式日志API
7.7.7 Java 17增強(qiáng)的NumberFormat
7.7.8 使用JDK 17新增的HexFormat處理十六進(jìn)制數(shù)
7.7.9 使用DateFormat格式化日期、時(shí)間
7.7.10 使用SimpleDateFormat格式化日期
7.8 Java 17增強(qiáng)的日期、時(shí)間格式器
7.8.1 使用DateTimeFormatter完成格式化
7.8.2 使用DateTimeFormatter解析字符串
7.9 本章小結(jié)
本章練習(xí)
第8章 Java集合
8.1 Java集合概述
8.2 Collection和Iterator接口
8.2.1 使用Lambda表達(dá)式遍歷集合
8.2.2 使用Iterator遍歷集合元素
8.2.3 使用Lambda表達(dá)式遍歷Iterator
8.2.4 使用foreach循環(huán)遍歷集合元素
8.2.5 使用Predicate操作集合
8.2.6 使用Stream操作集合
8.3 Set集合
8.3.1 HashSet類
hashCode()方法對于HashSet是不是十分重要?
8.3.2 LinkedHashSet類
8.3.3 TreeSet類
8.3.4 EnumSet類
8.3.5 各Set實(shí)現(xiàn)類的性能分析
8.4 List集合
8.4.1 改進(jìn)的List接口和ListIterator接口
8.4.2 ArrayList和Vector實(shí)現(xiàn)類
8.4.3 固定長度的List
8.5 Queue集合
8.5.1 PriorityQueue實(shí)現(xiàn)類
8.5.2 Deque接口與ArrayDeque實(shí)現(xiàn)類
8.5.3 LinkedList實(shí)現(xiàn)類
8.5.4 各種線性表的性能分析
8.6 Map集合
8.6.1 與Lambda表達(dá)式相關(guān)的Map方法
8.6.2 改進(jìn)的HashMap和Hashtable實(shí)現(xiàn)類
8.6.3 LinkedHashMap實(shí)現(xiàn)類
8.6.4 使用Properties讀/寫屬性文件
8.6.5 Java 17增強(qiáng)的TreeMap實(shí)現(xiàn)類
8.6.6 WeakHashMap實(shí)現(xiàn)類
8.6.7 IdentityHashMap實(shí)現(xiàn)類
8.6.8 EnumMap實(shí)現(xiàn)類
8.6.9 各Map實(shí)現(xiàn)類的性能分析
8.7 HashSet和HashMap的性能選項(xiàng)
8.8 操作集合的工具類:Collections
8.8.1 排序操作
8.8.2 查找、替換操作
8.8.3 同步控制
8.8.4 設(shè)置不可變集合
8.8.5 新式的不可變集合
8.9 煩瑣的接口:Enumeration
8.10 本章小結(jié)
本章練習(xí)
第9章 泛型
9.1 泛型入門
9.1.1 在編譯時(shí)不檢查類型導(dǎo)致的異常
9.1.2 使用泛型
9.1.3 “菱形”語法
9.2 深入泛型
9.2.1 定義泛型接口、泛型類
9.2.2 從泛型類派生子類
9.2.3 并不存在泛型類
9.3 類型通配符
9.3.1 使用類型通配符
9.3.2 設(shè)定類型通配符的上限
9.3.3 設(shè)定類型通配符的下限
9.3.4 設(shè)定泛型形參的上限
9.4 泛型方法
9.4.1 定義泛型方法
9.4.2 泛型方法和類型通配符的區(qū)別
9.4.3 “菱形”語法與泛型構(gòu)造器
9.4.4 泛型方法與方法重載
9.4.5 類型推斷
9.5 擦除和轉(zhuǎn)換
9.6 泛型與數(shù)組
9.7 本章小結(jié)
第10章 異常處理
10.1 異常概述
10.2 異常處理機(jī)制
10.2.1 使用try...catch捕捉異常
10.2.2 異常類的繼承體系
10.2.3 多異常捕捉
10.2.4 訪問異常信息
10.2.5 使用finally回收資源
10.2.6 異常處理的嵌套
10.2.7 自動(dòng)關(guān)閉資源的try語句
10.3 Checked異常和Runtime異常體系
10.3.1 使用throws聲明拋出異常
10.3.2 方法重寫時(shí)聲明拋出異常的限制
10.4 使用throw拋出異常
10.4.1 拋出異常
10.4.2 自定義異常類
10.4.3 catch和throw同時(shí)使用
10.4.4 使用throw語句拋出異常
10.4.5 異常鏈
10.5 Java的異常跟蹤棧
10.6 異常處理規(guī)則
10.6.1 不要過度使用異常
10.6.2 不要使用過于龐大的try塊
10.6.3 避免使用Catch All語句
10.6.4 不要忽略捕捉到的異常
10.7 本章小結(jié)
本章練習(xí)
第11章 AWT編程
11.1 GUI和AWT
11.2 AWT容器
11.3 布局管理器
11.3.1 FlowLayout布局管理器
11.3.2 BorderLayout布局管理器
BorderLayout最多只能放置5個(gè)組件嗎?那它也太不實(shí)用了吧?
11.3.3 GridLayout布局管理器
11.3.4 GridBagLayout布局管理器
11.3.5 CardLayout布局管理器
11.3.6 絕對定位
11.3.7 BoxLayout布局管理器
圖11.15和圖11.16顯示的所有按鈕都緊挨在一起,如果希望像FlowLayout、GridLayout等布局管理器那樣指定組件的間距應(yīng)該怎么辦?
11.4 AWT常用組件
11.4.1 基本組件
11.4.2 對話框
11.5 事件處理
11.5.1 Java事件模型的流程
11.5.2 事件和事件監(jiān)聽器
11.5.3 事件適配器
11.5.4 使用內(nèi)部類實(shí)現(xiàn)事件監(jiān)聽器
11.5.5 使用外部類實(shí)現(xiàn)事件監(jiān)聽器
11.5.6 類本身作為事件監(jiān)聽器類
11.5.7 使用匿名內(nèi)部類或Lambda表達(dá)式實(shí)現(xiàn)事件監(jiān)聽器
11.6 AWT菜單
11.6.1 菜單條、菜單和菜單項(xiàng)
11.6.2 右鍵菜單
為什么即使沒有給多行文本域編寫右鍵菜單,但是當(dāng)我在多行文本域上單擊右鍵時(shí)也一樣會(huì)彈出右鍵菜單?
11.7 在AWT中繪圖
11.7.1 畫圖的實(shí)現(xiàn)原理
11.7.2 使用Graphics類
11.8 處理位圖
11.8.1 Image抽象類和BufferedImage實(shí)現(xiàn)類
11.8.2 使用ImageIO讀/寫位圖
11.9 剪貼板
11.9.1 數(shù)據(jù)傳遞的類和接口
11.9.2 傳遞文本
11.9.3 使用系統(tǒng)剪貼板傳遞圖像
11.9.4 使用本地剪貼板傳遞對象引用
11.9.5 通過系統(tǒng)剪貼板傳遞Java對象
11.10 拖放功能
11.10.1 拖放目標(biāo)
11.10.2 拖放源
11.11 本章小結(jié)
本章練習(xí)