本書是一部系統(tǒng)論述Kotlin編程語(yǔ)言、面向?qū)ο缶幊谭椒ㄒ约昂瘮?shù)式編程思想的立體化教程(含紙質(zhì)圖書、電子書、教學(xué)課件、源代碼與視頻教程)。全書共分為5篇:第1篇Kotlin基礎(chǔ)(第1章~第10章),第2篇面向?qū)ο螅ǖ?1章~第13章),第3篇函數(shù)式編程(第14章~第17章),第4篇Kotlin進(jìn)階(第18章~第27章),第5篇項(xiàng)目實(shí)戰(zhàn)(第28章~第29章)。主要內(nèi)容包括:開(kāi)篇綜述;開(kāi)發(fā)環(huán)境搭建;*個(gè)Kotlin程序;Kotlin語(yǔ)法基礎(chǔ);Kotlin編碼規(guī)范;數(shù)據(jù)類型;字符串;運(yùn)算符;程序流程控制;函數(shù);面向?qū)ο缶幊;繼承與多態(tài);抽象類與接口;函數(shù)式編程基石高階函數(shù)和Lambda表達(dá)式;泛型;數(shù)據(jù)容器數(shù)組和集合;Kotlin中函數(shù)式編程API;異常處理;線程;協(xié)程;Kotlin與Java混合編程;Kotlin I/O與文件管理;網(wǎng)絡(luò)編程;Kotlin與Java Swing圖形用戶界面編程;輕量級(jí)SQL框架Exposed;反射;注解。*后給出了兩個(gè)項(xiàng)目設(shè)計(jì)案例,項(xiàng)目實(shí)戰(zhàn)1:開(kāi)發(fā)PetStore寵物商店項(xiàng)目;項(xiàng)目實(shí)戰(zhàn)2:開(kāi)發(fā)Kotlin版QQ2006聊天工具。
為便于讀者快速掌握Kotlin編程方法,本書作者精心制作了電子書、完整的教學(xué)課件、完整的源代碼與豐富的配套視頻教程,并提供在線答疑服務(wù)。
本書作者歷時(shí)一年,精心編寫了適合Kotlin入門者的一本立體化教程。本書是JetBrains公司官方推薦用書!贈(zèng)送教學(xué)課件29章,源代碼30章,教學(xué)視頻2500分鐘!并提供實(shí)時(shí)在線答疑服務(wù)
前 言
2017年5月19日的Google I/O大會(huì)上,谷歌公司宣布將Kotlin語(yǔ)言作為Android應(yīng)用開(kāi)發(fā)一級(jí)語(yǔ)言。國(guó)內(nèi)很快掀起了學(xué)習(xí)Kotlin的熱潮,就像2014年蘋果公司發(fā)布Swift語(yǔ)言一樣,一夜之間出現(xiàn)了很多團(tuán)隊(duì)翻譯官方文檔、錄制視頻課程。聽(tīng)說(shuō)了這個(gè)消息我非常激動(dòng),也想寫一本Kotlin立體圖書,包括電子書、配套視頻、課件和答疑服務(wù)。經(jīng)過(guò)了6個(gè)多月的專注寫作和實(shí)踐終成此書,6個(gè)月來(lái)放棄很多對(duì)家人的陪伴,感謝她們的理解和 寬容。
由于工作的原因,我在2015年就接觸到Kotlin語(yǔ)言,被它的簡(jiǎn)潔理念深深吸引。我將以前用Java編寫的QQ聊天工具用Kotlin語(yǔ)言重新編寫,代碼減少了30%。Kotlin語(yǔ)言的設(shè)計(jì)者們?cè)O(shè)計(jì)這門語(yǔ)言的目的是取代Java。誕生了20多年的Java雖然還是排名第一的語(yǔ)言,但仍被人詬病,現(xiàn)在從如下幾個(gè)方面討論一下。
1. 對(duì)函數(shù)式編程的支持
Java對(duì)函數(shù)式編程的支持不夠及時(shí)和徹底,直到Java 8才開(kāi)始支持函數(shù)式編程,但Java 8中并不支持函數(shù)類型,不能定義高階函數(shù);而Kotlin支持函數(shù)式編程。試比較以下代碼:
//Java面向?qū)ο蟠a片段
String userId = (String) jsonObj.get
("user_id");
//從clientList集合中刪除用戶
for (ClientInfo info : clientList) {
if (info.getUserId().equals
(userId)) {
clientList.remove(info);
break;
}
}
//Kotlin函數(shù)式編程代碼片段
val userId = jsonObject["user_id"] as String
val clientInfo = clientList.first {
it.userId == userId
}
//從clientList集合中刪除用戶
clientList.remove(clientInfo)
從上述代碼比較可見(jiàn),函數(shù)式編程中不再需要那些for和if等流程控制語(yǔ)句,對(duì)于數(shù)據(jù)的處理更加簡(jiǎn)潔。函數(shù)式編程并不能完全取代面向?qū)ο缶幊,函?shù)式編程擅長(zhǎng)進(jìn)行數(shù)據(jù)處理,如核心業(yè)務(wù)邏輯、算法實(shí)現(xiàn)等;而面向?qū)ο缶幊躺瞄L(zhǎng)構(gòu)建UI界面編程、搭建系統(tǒng)架構(gòu)等。
2. 異常處理的理念
Java把異常分為受檢查異常和運(yùn)行期異常,編譯器強(qiáng)制要求必須捕獲或拋出受檢查異常。經(jīng)過(guò)多年的實(shí)踐,開(kāi)發(fā)者發(fā)現(xiàn)即便是捕獲了那些受檢查異常,處理起來(lái)也力不從心。受檢查異常會(huì)使得程序結(jié)構(gòu)變得混亂,代碼大量增加。而Kotlin把所有的異常都看作是運(yùn)行期異常,編譯器不會(huì)強(qiáng)制要求捕獲或拋出任何異常,開(kāi)發(fā)人員可以酌情考慮是否捕獲和處理異常。
下面再比較一些代碼:
//Java文件復(fù)制代碼片段
try (FileInputStream fis = new
FileInputStream("./TestDir/src.zip");
BufferedInputStream bis = new
BufferedInputStream(fis);
FileOutputStream fos = new
FileOutputStream("./TestDir/
subDir/src.zip");
BufferedOutputStream bos = new
BufferedOutputStream(fos)) {
//準(zhǔn)備一個(gè)緩沖區(qū)
byte[] buffer = new byte[1024];
//首先讀取一次
int len = bis.read(buffer);
while (len != -1) {
//開(kāi)始寫入數(shù)據(jù)
bos.write(buffer, 0, len);
//再讀取一次
len = bis.read(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Kotlin函數(shù)式編程代碼片段
FileInputStream("./TestDir/src.zip")
.use { fis ->
FileOutputStream("./TestDir/subDir/
src.zip").use { fos ->
//復(fù)制到輸出流
fis.buffered().copyTo
(fos.buffered())
println("復(fù)制完成")
}
}
上述代碼實(shí)現(xiàn)了文件復(fù)制,Java代碼需要21行,而Kotlin代碼只需要7行。
3. 對(duì)可空類型的支持
空指針異常是Java最令人頭痛的問(wèn)題之一。Java數(shù)據(jù)類型可以接收空值;而Kotlin數(shù)據(jù)類型默認(rèn)不能接收空值,是非空數(shù)據(jù)類型,這樣就保證了數(shù)據(jù)類型的安全,防止空指針異常的發(fā)生。
這里只是比較了Java和Kotlin幾個(gè)最突出的區(qū)別,更多的不同和細(xì)微的差別還需要讀者閱讀此書,并自己編寫其中的每一個(gè)示例,感受Kotlin與Java的不同,感受Kotlin的 簡(jiǎn)潔。
本書服務(wù)網(wǎng)址
為了更好地為廣大讀者提供服務(wù),本書建立了一個(gè)服務(wù)網(wǎng)址www.zhijieketang/group/6,希望讀者對(duì)書中內(nèi)容發(fā)表評(píng)論,提出寶貴意見(jiàn)。
源代碼
書中包括了200多個(gè)完整的案例項(xiàng)目源代碼,讀者可以到本書網(wǎng)站www.zhijieketang/ group/6免費(fèi)注冊(cè)下載。
勘誤與支持
網(wǎng)站www.zhijieketang/group/6中建立了一個(gè)勘誤專區(qū),可以及時(shí)地把書中的問(wèn)題、失誤和勘誤反饋給廣大讀者。如果讀者發(fā)現(xiàn)了任何問(wèn)題,均可以在網(wǎng)上留言,也可以發(fā)送電子郵件到eorient@sina.com,也可以通過(guò)作者的新浪微博(@tony_關(guān)東升)或微信(q270258799)聯(lián)系作者與編輯。
致謝
本書主要由關(guān)東升著。此外,智捷課堂團(tuán)隊(duì)的趙志榮、趙大羽、關(guān)錦華、閆婷嬌、王馨然、關(guān)秀華、劉佳笑和趙浩丞參與了部分內(nèi)容的編寫。感謝清華大學(xué)出版社的盛東亮編輯給本書提供的寶貴意見(jiàn)。感謝趙浩丞手繪了書中全部草圖,并從專業(yè)的角度修改書中圖片,力求更加真實(shí)完美地奉獻(xiàn)給廣大讀者。感謝我的家人容忍我的忙碌以及對(duì)我的關(guān)心和照顧,使我能抽出這么多時(shí)間,投入全部精力,專心編寫此書。
由于時(shí)間倉(cāng)促,書中難免存在不妥之處,請(qǐng)讀者原諒,并提出寶貴意見(jiàn)。
關(guān)東升
2018年6月
關(guān)東升:一個(gè)在IT領(lǐng)域摸爬滾打20多年的老程序員、培訓(xùn)師、作者。精通多種IT技術(shù)。參與設(shè)計(jì)和開(kāi)發(fā)北京市公交一卡通大型項(xiàng)目,開(kāi)發(fā)國(guó)家農(nóng)產(chǎn)品追溯系統(tǒng)、金融系統(tǒng)微博等移動(dòng)客戶端項(xiàng)目,并在App Store發(fā)布多款游戲和應(yīng)用軟件。 近期為中國(guó)移動(dòng)、中國(guó)聯(lián)通、南方航空、中石油、工商銀行、平安銀行和天津港務(wù)局等企事業(yè)單位授課。著有《iOS開(kāi)發(fā)指南》《從零開(kāi)始學(xué)Swift》《Android網(wǎng)絡(luò)游戲開(kāi)發(fā)實(shí)戰(zhàn)》《Cocos2d-x實(shí)戰(zhàn)》系列和《JSP網(wǎng)絡(luò)程序設(shè)計(jì)》等40多本計(jì)算機(jī)書籍。
目 錄
推薦序 1
前言 3
配套資源說(shuō)明 6
學(xué)習(xí)路線圖 7
內(nèi)容說(shuō)明 9
第1篇 Kotlin基礎(chǔ)
本篇視頻:454分鐘
第1章 開(kāi)篇綜述 2
本章視頻:33分鐘
1.1 Kotlin語(yǔ)言簡(jiǎn)介 2
1.1.1 Kotlin語(yǔ)言歷史 2
1.1.2 Kotlin語(yǔ)言設(shè)計(jì)目標(biāo) 2
1.2 Kotlin語(yǔ)言特點(diǎn) 3
1.3 Kotlin與Java虛擬機(jī) 4
1.3.1 Java虛擬機(jī) 4
1.3.2 Kotlin應(yīng)用程序運(yùn)行過(guò)程 5
1.4 如何獲得幫助 5
第2章 開(kāi)發(fā)環(huán)境搭建 8
本章視頻:25分鐘
2.1 JDK工具包 8
2.1.1 JDK下載和安裝 8
2.1.2 設(shè)置環(huán)境變量 10
2.2 IntelliJ IDEA開(kāi)發(fā)工具 12
2.3 Eclipse開(kāi)發(fā)工具 13
2.3.1 Eclipse下載和安裝 13
2.3.2 安裝Kotlin插件 17
2.4 Kotlin編譯器 18
2.4.1 下載Kotlin編譯器 18
2.4.2 設(shè)置Kotlin編譯器環(huán)境變量 19
2.5 文本編輯工具 20
2.5.1 在Sublime Text中安裝Kotlin語(yǔ)言包 20
2.5.2 Sublime Text與Kotlin編譯器集成 21
第3章 第一個(gè)Kotlin程序 25
本章視頻:22分鐘
3.1 使用REPL實(shí)現(xiàn) 25
3.2 使用IntelliJ IDEA實(shí)現(xiàn) 26
3.2.1 創(chuàng)建項(xiàng)目 26
3.2.2 創(chuàng)建Kotlin源代碼文件 28
3.2.3 編寫代碼 29
3.2.4 運(yùn)行程序 30
3.3 使用IntelliJ IDEA與Gradle實(shí)現(xiàn) 30
3.4 使用Eclipse與Kotlin插件實(shí)現(xiàn) 33
3.4.1 創(chuàng)建項(xiàng)目 33
3.4.2 創(chuàng)建Kotlin源代碼文件 34
3.4.3 運(yùn)行程序 35
3.5 使用文本編輯工具與Kotlin編譯器實(shí)現(xiàn) 37
3.5.1 編寫代碼 37
3.5.2 編譯程序 37
3.5.3 運(yùn)行程序 39
3.6 代碼解釋 39
第4章 Kotlin語(yǔ)法基礎(chǔ) 41
本章視頻:52分鐘
4.1 標(biāo)識(shí)符和關(guān)鍵字 41
4.1.1 標(biāo)識(shí)符 41
4.1.2 關(guān)鍵字 42
4.2 變量和常量 43
4.2.1 變量 43
4.2.2 常量和只讀變量 44
4.2.3 使用var還是val 45
4.3 注釋 46
4.4 語(yǔ)句與表達(dá)式 47
4.4.1 語(yǔ)句 48
4.4.2 表達(dá)式 48
4.5 包 49
4.5.1 包的作用 49
4.5.2 包的定義 50
4.5.3 包的引入 51
第5章 Kotlin編碼規(guī)范 53
本章視頻:49分鐘
5.1 命名規(guī)范 53
5.2 注釋規(guī)范 55
5.2.1 文件注釋 55
5.2.2 文檔注釋 55
5.2.3 代碼注釋 58
5.2.4 使用地標(biāo)注釋 59
5.3 聲明 60
5.3.1 變量或常量聲明 60
5.3.2 類聲明 61
5.4 代碼排版 62
5.4.1 空行 62
5.4.2 空格 64
5.4.3 縮進(jìn) 65
5.4.4 斷行 65
5.5 省略規(guī)范 66
第6章 數(shù)據(jù)類型 68
本章視頻:45分鐘
6.1 回顧Java數(shù)據(jù)類型 68
6.2 Kotlin基本數(shù)據(jù)類型 69
6.2.1 整型類型 70
6.2.2 浮點(diǎn)類型 71
6.2.3 字符類型 72
6.2.4 布爾類型 74
6.3 數(shù)值類型之間的轉(zhuǎn)換 75
6.3.1 賦值與顯式轉(zhuǎn)換 75
6.3.2 數(shù)學(xué)計(jì)算與隱式轉(zhuǎn)換 77
6.4 可空類型 77
6.4.1 可空類型概念 78
6.4.2 使用安全調(diào)用運(yùn)算符(?.) 78
6.4.3 非空斷言運(yùn)算符(!!) 79
6.4.4 使用Elvis運(yùn)算符(?:) 80
第7章 字符串 82
本章視頻:93分鐘
7.1 字符串字面量 82
7.1.1 普通字符串 82
7.1.2 原始字符串 83
7.2 不可變字符串 85
7.2.1 String 85
7.2.2 字符串拼接 86
7.2.3 字符串模板 87
7.2.4 字符串查找 89
7.2.5 字符串比較 91
7.2.6 字符串截取 93
7.3 可變字符串 94
7.3.1 StringBuilder 94
7.3.2 字符串追加、插入、刪除和替換 95
7.4 正則表達(dá)式 97
7.4.1 Regex類 97
7.4.2 字符串匹配 98
7.4.3 字符串查找 99
7.4.4 字符串替換 99
7.4.5 字符串分割 100
第8章 運(yùn)算符 102
本章視頻:51分鐘
8.1 算術(shù)運(yùn)算符 102
8.1.1 一元運(yùn)算符 102
8.1.2 二元運(yùn)算符 103
8.1.3 算術(shù)賦值運(yùn)算符 104
8.2 關(guān)系運(yùn)算符 105
8.3 邏輯運(yùn)算符 107
8.4 位運(yùn)算符 108
8.5 其他運(yùn)算符 111
8.6 運(yùn)算符優(yōu)先級(jí) 111
第9章 程序流程控制 113
本章視頻:47分鐘
9.1 if分支結(jié)構(gòu) 113
9.1.1 if結(jié)構(gòu)當(dāng)作語(yǔ)句使用 113
9.1.2 if表達(dá)式 115
9.2 when多分支結(jié)構(gòu) 117
9.2.1 when結(jié)構(gòu)當(dāng)作語(yǔ)句使用 118
9.2.2 when表達(dá)式 119
9.3 循環(huán)結(jié)構(gòu) 121
9.3.1 while語(yǔ)句 121
9.3.2 do-while語(yǔ)句 122
9.3.3 for語(yǔ)句 122
9.4 跳轉(zhuǎn)語(yǔ)句 124
9.4.1 break語(yǔ)句 124
9.4.2 continue語(yǔ)句 126
9.5 使用區(qū)間 128
9.5.1 表示區(qū)間 128
9.5.2 使用in和!in關(guān)鍵字 129
第10章 函數(shù) 131
本章視頻:37分鐘
10.1 函數(shù)聲明 131
10.2 返回特殊數(shù)據(jù) 132
10.2.1 無(wú)返回?cái)?shù)據(jù)與Unit類型 132
10.2.2 永遠(yuǎn)不會(huì)正常返回?cái)?shù)據(jù)與Nothing類型 133
10.3 函數(shù)參數(shù) 134
10.3.1 使用命名參數(shù)調(diào)用函數(shù) 134
10.3.2 參數(shù)默認(rèn)值 135
10.3.3 可變參數(shù) 136
10.4 表達(dá)式函數(shù)體 137
10.5 局部函數(shù) 137
10.6 匿名函數(shù) 138
第2篇 面向?qū)ο?br />本篇視頻:360分鐘
第11章 面向?qū)ο缶幊?142
本章視頻:246分鐘
11.1 面向?qū)ο蟾攀?142
11.2 面向?qū)ο蟮娜齻(gè)基本特性 143
11.2.1 封裝性 143
11.2.2 繼承性 143
11.2.3 多態(tài)性 144
11.3 類聲明 144
11.4 屬性 146
11.4.1 回顧JavaBean 146
11.4.2 聲明屬性 147
11.4.3 延遲初始化屬性 150
11.4.4 委托屬性 151
11.4.5 惰性加載屬性 152
11.4.6 可觀察屬性 153
11.5 擴(kuò)展 154
11.5.1 擴(kuò)展函數(shù) 155
11.5.2 擴(kuò)展屬性 156
11.5.3 成員優(yōu)先原則 157
11.5.4 定義中綴運(yùn)算符 159
11.6 構(gòu)造函數(shù) 160
11.6.1 主構(gòu)造函數(shù) 160
11.6.2 次構(gòu)造函數(shù) 162
11.6.3 默認(rèn)構(gòu)造函數(shù) 163
11.7 封裝性與可見(jiàn)性修飾符 164
11.7.1 可見(jiàn)性范圍 164
11.7.2 公有可見(jiàn)性 166
11.7.3 內(nèi)部可見(jiàn)性 167
11.7.4 保護(hù)可見(jiàn)性 167
11.7.5 私有可見(jiàn)性 168
11.8 數(shù)據(jù)類 169
11.8.1 聲明數(shù)據(jù)類 170
11.8.2 使用copy函數(shù) 171
11.8.3 解構(gòu)數(shù)據(jù)類 172
11.9 枚舉類 172
11.9.1 聲明枚舉類 172
11.9.2 枚舉類構(gòu)造函數(shù) 174
11.9.3 枚舉常用屬性和函數(shù) 175
11.10 嵌套類 176
11.10.1 嵌套類 176
11.10.2 內(nèi)部類 178
11.11 強(qiáng)大的object關(guān)鍵字 180
11.11.1 對(duì)象表達(dá)式 180
11.11.2 對(duì)象聲明 182
11.11.3 伴生對(duì)象 184
第12章 繼承與多態(tài) 188
本章視頻:78分鐘
12.1 Kotlin中的繼承 188
12.2 調(diào)用父類構(gòu)造函數(shù) 190
12.2.1 使用主構(gòu)造函數(shù) 191
12.2.2 使用次構(gòu)造函數(shù)重載 192
12.2.3 使用參數(shù)默認(rèn)值調(diào)用構(gòu)造函數(shù) 193
12.3 重寫成員屬性和函數(shù) 194
12.3.1 重寫成員屬性 194
12.3.2 重寫成員函數(shù) 195
12.4 多態(tài) 197
12.4.1 多態(tài)概念 197
12.4.2 使用is和!is進(jìn)行類型檢查 199
12.4.3 使用as和as?進(jìn)行類型轉(zhuǎn)換 202
12.5 密封類 203
第13章 抽象類與接口 206
本章視頻:36分鐘
13.1 抽象類 206
13.1.1 抽象類概念 206
13.1.2 抽象類聲明和實(shí)現(xiàn) 206
13.2 使用接口 209
13.2.1 接口概念 209
13.2.2 接口聲明和實(shí)現(xiàn) 209
13.2.3 接口與多繼承 212
13.2.4 接口繼承 213
13.2.5 接口中的具體函數(shù)和屬性 214
第3篇 函數(shù)式編程
本篇視頻:302分鐘
第14章 函數(shù)式編程基石高階函數(shù)和Lambda表達(dá)式 218
本章視頻:91分鐘
14.1 函數(shù)式編程簡(jiǎn)介 218
14.2 高階函數(shù) 218
14.2.1 函數(shù)類型 219
14.2.2 函數(shù)字面量 220
14.2.3 函數(shù)作為另一個(gè)函數(shù)返回值使用 221
14.2.4 函數(shù)作為參數(shù)使用 222
14.3 Lambda表達(dá)式 223
14.3.1 Lambda表達(dá)式標(biāo)準(zhǔn)語(yǔ)法格式 223
14.3.2 使用Lambda表達(dá)式 225
14.3.3 Lambda表達(dá)式簡(jiǎn)化寫法 225
14.3.4 Lambda表達(dá)式與return語(yǔ)句 228
14.4 閉包與捕獲變量 229
14.5 內(nèi)聯(lián)函數(shù) 232
14.5.1 自定義內(nèi)聯(lián)函數(shù) 232
14.5.2 使用let函數(shù) 233
14.5.3 使用with和apply函數(shù) 233
第15章 泛型 236
本章視頻:51分鐘
15.1 泛型函數(shù) 236
15.1.1 聲明泛型函數(shù) 236
15.1.2 多類型參數(shù) 237
15.1.3 泛型約束 237
15.1.4 可空類型參數(shù) 238
15.2 泛型屬性 239
15.3 泛型類 240
15.4 泛型接口 242
第16章 數(shù)據(jù)容器數(shù)組和集合 245
本章視頻:81分鐘
16.1 數(shù)組 245
16.1.1 對(duì)象數(shù)組 245
16.1.2 基本數(shù)據(jù)類型數(shù)組 248
16.2 集合概述 249
16.3 Set集合 250
16.3.1 不可變Set集合 250
16.3.2 可變Set集合 252
16.4 List集合 254
16.4.1 不可變List集合 255
16.4.2 可變List集合 256
16.5 Map集合 258
16.5.1 不可變Map集合 259
16.5.2 可變Map集合 261
第17章 Kotlin中函數(shù)式編程API 264
本章視頻:79分鐘
17.1 函數(shù)式編程API與鏈?zhǔn)秸{(diào)用 264
17.2 遍歷操作 265
17.2.1 forEach 265
17.2.2 forEachIndexed 266
17.3 三大基礎(chǔ)函數(shù) 267
17.3.1 filter 267
17.3.2 map 268
17.3.3 reduce 269
17.4 聚合函數(shù) 270
17.5 過(guò)濾函數(shù) 272
17.6 映射函數(shù) 273
17.7 排序函數(shù) 275
17.8 案例:求階乘 276
17.9 案例:計(jì)算水仙花數(shù) 277
第4篇 Kotlin進(jìn)階
本篇視頻:744分鐘
第18章 異常處理 280
本章視頻:67分鐘
18.1 從一個(gè)問(wèn)題開(kāi)始 280
18.2 異常類繼承層次 281
18.2.1 Throwable類 281
18.2.2 Error和Exception 283
18.3 捕獲異常 283
18.3.1 try-catch語(yǔ)句 284
18.3.2 try-catch表達(dá)式 285
18.3.3 多catch代碼塊 286
18.3.4 try-catch語(yǔ)句嵌套 288
18.4 釋放資源 289
18.4.1 finally代碼塊 290
18.4.2 自動(dòng)資源管理 293
18.5 throw與顯式拋出異常 294
第19章 線程 297
本章視頻:49分鐘
19.1 基礎(chǔ)知識(shí) 297
19.1.1 進(jìn)程 297
19.1.2 線程 297
19.1.3 主線程 298
19.2 創(chuàng)建線程 299
19.3 線程狀態(tài) 301
19.4 線程管理 302
19.4.1 等待線程結(jié)束 302
19.4.2 線程讓步 304
19.4.3 線程停止 305
第20章 協(xié)程 308
本章視頻:57分鐘
20.1 協(xié)程介紹 308
20.2 創(chuàng)建協(xié)程 308
20.2.1 Kotlin協(xié)程API 308
20.2.2 創(chuàng)建支持kotlinx.coroutines的項(xiàng)目 309
20.2.3 第一個(gè)協(xié)程程序 310
20.2.4 launch函數(shù)與Job對(duì)象 311
20.2.5 runBlocking函數(shù) 313
20.2.6 掛起函數(shù) 314
20.3 協(xié)程生命周期 316
20.4 管理協(xié)程 317
20.4.1 等待協(xié)程結(jié)束 317
20.4.2 超時(shí)設(shè)置 318
20.4.3 取消協(xié)程 320
第21章 Kotlin與Java混合編程 322
本章視頻:77分鐘
21.1 數(shù)據(jù)類型映射 322
21.1.1 Java基本數(shù)據(jù)類型與Kotlin數(shù)據(jù)類型映射 322
21.1.2 Java包裝類與Kotlin數(shù)據(jù)類型映射 322
21.1.3 Java常用類與Kotlin數(shù)據(jù)類型映射 323
21.1.4 Java集合類型與Kotlin數(shù)據(jù)類型映射 323
21.2 Kotlin調(diào)用Java 324
21.2.1 避免Kotlin關(guān)鍵字 324
21.2.2 平臺(tái)類型與空值 325
21.2.3 異常檢查 327
21.2.4 調(diào)用Java函數(shù)式接口 327
21.3 Java調(diào)用Kotlin 328
21.3.1 訪問(wèn)Kotlin屬性 329
21.3.2 訪問(wèn)包級(jí)別成員 329
21.3.3 實(shí)例字段、靜態(tài)字段和靜態(tài)函數(shù) 330
21.3.4 可見(jiàn)性 334
21.3.5 生成重載函數(shù) 336
21.3.6 異常檢查 338
第22章 Kotlin I/O與文件管理 340
本章視頻:49分鐘
22.1 Java I/O流概述 340
22.1.1 Java流設(shè)計(jì)理念 340
22.1.2 Java流類繼承層次 341
22.2 字節(jié)流 343
22.2.1 InputStream抽象類 344
22.2.2 OutputStream抽象類 344
22.2.3 案例:文件復(fù)制 345
22.3 字符流 346
22.3.1 Reader抽象類 346
22.3.2 Writer抽象類 346
22.3.3 案例:文件復(fù)制 347
22.4 文件管理 348
22.4.1 File類擴(kuò)展函數(shù) 348
22.4.2 案例:讀取目錄文件 349
第23章 網(wǎng)絡(luò)編程 351
本章視頻:115分鐘
23.1 網(wǎng)絡(luò)基礎(chǔ) 351
23.1.1 網(wǎng)絡(luò)結(jié)構(gòu) 351
23.1.2 TCP/IP協(xié)議 352
23.1.3 IP地址 352
23.1.4 端口 353
23.2 TCP Socket低層次網(wǎng)絡(luò)編程 353
23.2.1 TCP Socket通信概述 353
23.2.2 TCP Socket通信過(guò)程 353
23.2.3 Socket類 354
23.2.4 ServerSocket類 356
23.2.5 案例:文件上傳工具 356
23.3 UDP Socket低層次網(wǎng)絡(luò)編程 358
23.3.1 DatagramSocket類 358
23.3.2 DatagramPacket類 359
23.3.3 案例:文件上傳工具 360
23.4 數(shù)據(jù)交換格式 362
23.4.1 JSON文檔結(jié)構(gòu) 363
23.4.2 使用第三方JSON庫(kù) 365
23.4.3 JSON數(shù)據(jù)編碼和解碼 366
23.5 訪問(wèn)互聯(lián)網(wǎng)資源 368
23.5.1 URL的概念 368
23.5.2 HTTP/HTTPS協(xié)議 369
23.5.3 使用URL類 369
23.5.4 使用HttpURLConnection發(fā)送GET請(qǐng)求 370
23.5.5 使用HttpURLConnection發(fā)送POST請(qǐng)求 372
23.5.6 實(shí)例:Downloader 373
第24章 Kotlin與Java Swing圖形用戶界面編程 375
本章視頻:182分鐘
24.1 Java圖形用戶界面技術(shù) 375
24.2 Swing技術(shù)基礎(chǔ) 376
24.2.1 Swing類層次結(jié)構(gòu) 377
24.2.2 Swing程序結(jié)構(gòu) 378
24.3 事件處理模型 381
24.3.1 內(nèi)部類和對(duì)象表達(dá)式處理事件 382
24.3.2 Lambda表達(dá)式處理事件 384
24.3.3 使用適配器 385
24.4 布局管理 387
24.4.1 FlowLayout布局 387
24.4.2 BorderLayout布局 389
24.4.3 GridLayout布局 391
24.4.4 不使用布局管理器 393
24.5 Swing組件 395
24.5.1 標(biāo)簽和按鈕 395
24.5.2 文本輸入組件 398
24.5.3 復(fù)選框和單選按鈕 401
24.5.4 下拉列表 404
24.5.5 列表 406
24.5.6 分隔面板 407
24.5.7 使用表格 409
24.6 案例:圖書庫(kù)存 413
第25章 輕量級(jí)SQL框架 Exposed 418
本章視頻:91分鐘
25.1 MySQL數(shù)據(jù)庫(kù)管理系統(tǒng) 418
25.1.1 數(shù)據(jù)庫(kù)安裝與配置 418
25.1.2 連接MySQL服務(wù)器 422
25.1.3 常見(jiàn)的管理命令 425
25.2 Kotlin與DSL語(yǔ)言 429
25.3 使用Exposed框架 430
25.3.1 配置項(xiàng)目 430
25.3.2 面向DSL API 431
25.3.3 面向?qū)ο驛PI 434
25.4 案例:多表連接查詢操作 436
25.4.1 創(chuàng)建數(shù)據(jù)庫(kù) 437
25.4.2 配置SQL日志 438
25.4.3 實(shí)現(xiàn)查詢 438
第26章 反射 442
本章視頻:34分鐘
26.1 Kotlin反射API 442
26.2 引用類 443
26.3 調(diào)用函數(shù) 445
26.4 調(diào)用構(gòu)造函數(shù) 446
26.5 調(diào)用屬性 448
第27章 注解 451
本章視頻:23分鐘
27.1 元注解 451
27.2 自定義注解 453
27.2.1 聲明注解 453
27.2.2 案例:使用元注解 454
27.2.3 注解目標(biāo)聲明 456
27.2.4 案例:讀取運(yùn)行時(shí)注解信息 457
第5篇 項(xiàng)目實(shí)戰(zhàn)
本篇視頻:621分鐘
第28章 項(xiàng)目實(shí)戰(zhàn)1:開(kāi)發(fā)PetStore寵物商店項(xiàng)目 460
本章視頻:309分鐘
28.1 系統(tǒng)分析與設(shè)計(jì) 460
28.1.1 項(xiàng)目概述 460
28.1.2 需求分析 461
28.1.3 原型設(shè)計(jì) 461
28.1.4 數(shù)據(jù)庫(kù)設(shè)計(jì) 463
28.1.5 架構(gòu)設(shè)計(jì) 465
28.1.6 系統(tǒng)設(shè)計(jì) 466
28.2 任務(wù)1:創(chuàng)建數(shù)據(jù)庫(kù) 467
28.2.1 迭代1.1:安裝和配置MySQL數(shù)據(jù)庫(kù) 467
28.2.2 迭代1.2:編寫數(shù)據(jù)庫(kù)DDL腳本 467
28.2.3 迭代1.3:插入初始數(shù)據(jù)到數(shù)據(jù)庫(kù) 468
28.3 任務(wù)2:初始化項(xiàng)目 469
28.3.1 迭代2.1:配置項(xiàng)目 469
28.3.2 迭代2.2:添加資源圖片 470
28.3.3 迭代2.3:添加包 471
28.4 任務(wù)3:編寫數(shù)據(jù)持久層代碼 471
28.4.1 迭代3.1:編寫實(shí)體類 471
28.4.2 迭代3.2:創(chuàng)建數(shù)據(jù)表類 474
28.4.3 迭代3.3:編寫DAO類 475
28.5 任務(wù)4:編寫表示層代碼 483
28.5.1 迭代4.1:編寫啟動(dòng)類 483
28.5.2 迭代4.2:編寫自定義窗口類MyFrame 483
28.5.3 迭代4.3:用戶登錄窗口 485
28.5.4 迭代4.4:商品列表窗口 487
28.5.5 迭代4.5:商品購(gòu)物車窗口 495
28.6 任務(wù)5:應(yīng)用程序打包發(fā)布 503
28.6.1 迭代5.1:處理TODO和FIXME任務(wù) 503
28.6.2 迭代5.2:打包 503
第29章 項(xiàng)目實(shí)戰(zhàn)2:開(kāi)發(fā)Kotlin版QQ2006聊天工具 507
本章視頻:312分鐘
29.1 系統(tǒng)分析與設(shè)計(jì) 507
29.1.1 項(xiàng)目概述 507
29.1.2 需求分析 508
29.1.3 原型設(shè)計(jì) 509
29.1.4 數(shù)據(jù)庫(kù)設(shè)計(jì) 509
29.1.5 網(wǎng)絡(luò)拓?fù)鋱D 512
29.1.6 系統(tǒng)設(shè)計(jì) 512
29.2 任務(wù)1:創(chuàng)建服務(wù)器端數(shù)據(jù)庫(kù) 513
29.2.1 迭代1.1:安裝和配置MySQL數(shù)據(jù)庫(kù) 513
29.2.2 迭代1.2:編寫數(shù)據(jù)庫(kù)DDL腳本 514
29.2.3 迭代1.3:插入初始數(shù)據(jù)到數(shù)據(jù)庫(kù) 514
29.3 任務(wù)2:初始化項(xiàng)目 515
29.3.1 任務(wù)2.1:配置項(xiàng)目 515
29.3.2 任務(wù)2.2:添加資源圖片 516
29.3.3 任務(wù)2.3:添加包 517
29.4 任務(wù)3:編寫服務(wù)器端外圍代碼 517
29.4.1 任務(wù)3.1:創(chuàng)建數(shù)據(jù)表類 517
29.4.2 任務(wù)3.2:編寫UserDAO類 518
29.4.3 任務(wù)3.3:編寫ClientInfo類 521
29.5 任務(wù)4:客戶端UI實(shí)現(xiàn) 521
29.5.1 迭代4.1:登錄窗口實(shí)現(xiàn) 521
29.5.2 迭代4.2:好友列表窗口實(shí)現(xiàn) 525
29.5.3 迭代4.3:聊天窗口實(shí)現(xiàn) 529
29.6 任務(wù)5:用戶登錄過(guò)程實(shí)現(xiàn) 533
29.6.1 迭代5.1:客戶端啟動(dòng) 533
29.6.2 迭代5.2:客戶端登錄編程 535
29.6.3 迭代5.3:服務(wù)器啟動(dòng) 538
29.6.4 迭代5.4:服務(wù)器驗(yàn)證編程 539
29.7 任務(wù)6:刷新好友列表 541
29.7.1 迭代6.1:刷新好友列表服務(wù)器端編程 542
29.7.2 迭代6.2:刷新好友列表客戶端編程 543
29.8 任務(wù)7:聊天過(guò)程實(shí)現(xiàn) 547
29.8.1 迭代7.1:客戶端用戶1向用戶3發(fā)送消息 548
29.8.2 迭代7.2:服務(wù)器接收用戶1消息與轉(zhuǎn)發(fā)給用戶3消息 549
29.8.3 迭代7.3:客戶端用戶3接收用戶1消息 551
29.9 任務(wù)8:用戶下線 552
29.9.1 迭代8.1:客戶端編程 553
29.9.2 迭代8.2:服務(wù)器端編程 554