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