編輯推薦
因此,在《揭秘 Kotlin 編程原理》中,讀者不僅能清晰地了解Kotlin的語法、高級特性,還能真正地掌握Kotlin背後的實現機制和設計哲學,形成對Kotlin語言既直觀、又深刻的認識——在此基礎上,讀者能準確、快速地上手實踐,大大提升自己的移動開發能力。
例如,Kotlin在不違反JVM規範的基礎上,融合了眾多程式語言的特性:它打破了Java封閉的徹底性,讓開發者可以體驗“面向過程”編程的感覺;它充分吸收了其他編輯語言中的好特性,提供了諸如VB語言中的“with語法”……此外,它提供了這樣一種能力,不用修改原有類,也無須通過繼承的方式,就能為某個類增加新的行為,等等。
Kotlin的這些特性和實現機制,可以幫助開發者掃清開發道路上的一些障礙,讓開發變得更加簡單!《揭秘Kotlin編程原理》是一本值得擁有,能切實幫助讀者加薪提職的好書!
內容簡介
Kotlin被谷歌宣布為官方語言以來,引發了極大的關注,並成為學習的熱點。
《揭秘Kotlin編程原理》主要從封裝、繼承和多態三個方面全面介紹了Kotlin面向對象設計的語法特性及其背後實現方式。全書可分為基礎篇、實戰篇與提高篇,內容上層層深入,揭示了Kotlin對屬性包裝、多種形態的函式定義方式、以及各種特殊類型的定義等方面的背後實現機制。
《揭秘Kotlin編程原理》適合各種程式語言的開發者閱讀,不管你是Java開發、Kotlin開發、Android開發,還是PHP、JSP,或者是C、C++、VB、Go語言的愛好者,都可以翻開閱讀。因為裡面總會有讓你感到熟悉的一些語言特性,當你看到Kotlin中也有這樣一種特性的時候,你一定會會心一笑!
作者簡介
阿里巴巴技術工程師,關注Java,現任職於菜鳥網路,負責中間件開發。著有《揭秘Java虛擬機:JVM設計原理與實現》一書,倍受讀者好評。
圖書目錄
1 快速入門 1
1.1 簡介 1
1.2 編寫第一個Hello World程式 3
1.3 程式結構 10
1.3.1 Kotlin源碼結構 10
1.3.2 包聲明與導入 11
1.3.3 後綴名 14
1.4 Kotlin標準庫 14
2 基本語法 19
2.1 基本類型 19
2.1.1 數字 20
2.1.2 字元串 23
2.2 變數與常量 24
2.2.1 常量 24
2.2.2 屬性包裝 25
2.3 函式 30
2.3.1 函式聲明 30
2.3.2 閉包 35
2.3.3 lambda表達式 40
2.3.4 內聯函式 54
3 封裝 58
3.1 構造函式與實例化 60
3.1.1 構造函式漫談 60
3.1.2 Kotlin構造函式 62
3.1.3 簡化的主構造函式 63
3.1.4 二級構造函式 66
3.1.5 C++構造函式與參數列表 69
3.1.6 默認構造函式與覆蓋 71
3.1.7 構造函式訪問許可權與預設 73
3.2 記憶體分配 75
3.2.1 JVM記憶體模型 75
3.2.2 類元信息 80
3.2.3 創建類實例 87
3.3 初始化 89
3.3.1 用構建器自動初始化 89
3.3.2 成員變數初始化 90
3.3.3 init{}初始化 92
3.3.4 聲明時初始化 96
3.3.5 初始化順序 98
3.4 類成員變數 103
3.4.1 賦初值 103
3.4.2 訪問許可權 111
3.5 數組 115
3.5.1 通過Array接口聲明數組 116
3.5.2 數組讀寫 119
3.5.3 聲明引用型數組 120
3.5.4 使用其他方式聲明數組 123
3.5.5 多維數組 129
3.5.6 數組與列錶轉換 131
3.6 靜態函式與伴隨對象 132
3.6.1 伴隨對象 133
3.6.2 名稱省略與實例化 135
3.6.3 伴隨對象中的屬性 136
3.6.4 伴隨對象的初始化 137
3.6.5 伴隨對象的原理 139
3.6.6 匿名類 145
4 繼承 149
4.1 繼承基礎概念 149
4.1.1 繼承語法 149
4.1.2 接口 152
4.1.3 虛類 165
4.2 多重繼承 168
4.2.1 類與接口的多重繼承 168
4.2.2 構造函式繼承 170
4.2.3 接口方法的多重繼承 174
4.3 繼承初始化 176
4.4 類型轉換 179
5 多態 183
5.1 概念 183
5.1.1 重寫 184
5.1.2 重載 185
5.2 擴展 189
5.2.1 概念 189
5.2.2 Kotlin的擴展 191
5.2.3 擴展與重載 193
5.2.4 函式擴展的多態性 196
5.2.5 函式擴展原理 201
5.2.6 屬性擴展 203
5.3.1 Kotlin中的操作符重載 205
5.3.2 通過擴展函式重載操作符 207
5.3.3 操作符重載原理 208
5.3.4 操作符重載限制 209
5.3.5 中綴符 211
5.4 指針與傳遞 212
5.4.1 Java中的類型與傳遞 213
5.4.2 按值/引用傳遞的終結者 216
5.4.3 this指針 218
5.4.4 類函式調用機制與this 222
6 Kotlin的I/O 224
6.1 Java I/O類庫 224
6.2 Kotlin I/O類庫 231
6.3 終端I/O 234
6.4 檔案I/O 237
6.5 檔案壓縮示例 239
6.6 序列化 241
6.6.1 Kotlin的序列化 242
6.6.2 序列化控制 245
7 Kotlin機制 247
7.1 函式定義 247
7.1.1 頂級函式 247
7.1.2 內聯函式 250
7.2 變數與屬性 257
7.2.1 屬性包裝 257
7.2.2 延遲初始化 261
7.2.3 let語法糖 264
7.3 類定義 266
7.3.1 Java內部類 267
7.3.2 Kotlin中的類 272
7.3.3 Kotlin類對頂級屬性和方法的訪問 274
7.3.4 Kotlin類中的成員變數 276
7.3.5 單例對象 279
媒體評論
Kotlin語言對Java語言特性的易用性進行了全方位的改進,越來越貼近廣大開發者的習慣。我本人最看中的是Kotlin未來對JavaScript和Native的支持,那時Kotlin會在各個編程領域得到廣泛套用。
《揭秘Kotlin編程原理》從語言的本質方面對Kotlin進行了全面講解,對於學習Kotlin語言的Java開發者,是一本難得的技術書籍。
——張建鋒,永源中間件共同創始人
Kotlin語言剛剛出來時,便令人眼前一亮!它的函式式編程、各種語法糖、代碼精簡性以及和Java代碼的兼容性,讓很多人覺得它取代Java只是時間問題,引發了業界極大的學習熱情。
市面上還沒有見到剖析Kotlin內部機制的著作。暢銷好書《揭秘Java虛擬機:JVM設計原理與實現》的作者,基於多年來對Java虛擬機的深刻理解,在第一時間研究了Kotlin語言,並將自己對Kotlin的透徹理解條分縷析地分享在這本《揭秘Kotlin編程原理》中:從淺顯易懂的入門知識到豁然開朗的原理分析,使讀者不僅能夠知其然,並且能夠知其所以然,從而能得心應手地運用好Kotlin。
——占軍(公眾號:占小狼的部落格),美團點評基礎架構組技術專家
Java是過去的20年裡非常成功的程式語言,但是由於它是一種通用的靜態類型的語言,在解決特定領域問題時會顯得非常“笨重”,於是湧現出了很多能在JVM上使用的非Java語言。Kotlin是JVM上眾多語言中的新寵,它完全兼容Java,提供了很多非常有趣的語法糖,支持函式式編程,最關鍵的是,和Java相比,它能大幅度地減少代碼量。
《揭秘Kotlin編程原理》對Kotlin的關鍵語法和核心特性進行了深入的講解,通過與其他語言(Java、C++)的比較以及直達JVM位元組碼的分析,為有編程經驗尤其是對Java語言有經驗的讀者迅速掌握Kotlin語言構建了一條快速通道。讓我們跟著作者一起加速一起飛。
——駱昊,北京千鋒互聯(成都)科技有限公司技術總監
前言
谷歌作為世界級的科技公司巨頭,強悍的技術研發與創新能力使其一直是業界的楷模,其在各個領域的每一次創新,都能夠一個新的時代!
Kotlin便是其最新的一個創新力作。
程式語言的歷史已經超過了半個世紀,從最初的機器二進制碼,到彙編、B語言,再到C語言,再到由C語言所開發出的其他若干種程式語言。每一種程式語言都有其特定的用途,例如C語言通常用於開發底層系統軟體或者驅動程式,而部分更底層的功能則必須要由彙編甚至是直接的機器指令去完成。再如C++、Delphi曾經統治了PC桌面軟體的開發領域,而套用伺服器端的開發則長期被PHP、ASP、JSP壟斷,瀏覽器端的嵌入式腳本則幾乎由JavaScript語言一統天下。
這幾年網際網路領域先後經歷了幾次大革命,包括物聯網、大數據、雲計算等,如今則處於人工智慧的火熱時代。在這個時代,人們極其努力地開啟機器智慧,在大數據樣本下,通過算法,讓機器進行一定的模糊識別,從而解決很多傳統辦法解決不了的棘手問題。伴隨其中的一個重要的程式語言便是Java,因為Java的口號是“write once, run anywhere”(即:一次編寫,到處運行)。Java由於其強大的跨平台(主要指作業系統)能力,而備受各種中間件組件開發人員的鐘愛。而Java之所以能夠跨平台,主要歸功於JVM虛擬機。
JVM虛擬機內部針對不同的底層平台進行了通用性抽象,從而可以讓Java這種上層程式語言對外提供統一的API,例如在進行多執行緒開發時,開發者無須在不同的平台上引入不同的類庫,而在開發界面視圖時,Java也提供統一的界面組件類庫。平台的差異化工作都交給底層的JVM虛擬機進行適配處理,從而讓高層業務開發人員可以專心進行業務設計與邏輯實現,不用再關心底層各種紛繁複雜的硬體和平台特性。開發人員需要感知的平台差異性僅僅在於需要在不同的平台上下載平台相關的JVM軟體而已。
在Java剛推出來的幾年裡,由於JVM的性能低下,導致不太被認可。但是後來隨著各種黑科技的引入,例如JIT即時編譯、基於Java位元組碼的棧頂快取技術、垃圾回收算法的改進、JDK高性能類庫(例如並發包、NIO等)的發布,等等,JVM的性能得到長足改進和飛速提升,早已今非昔比,在部分場景下甚至比C/C++的性能還要高,例如運行期所進行的方法與執行緒級的逃逸分析以及C1、C2分級動態編譯等技術。人們再也沒有任何理由拒絕使用Java,所以Java得到了飛速發展,多年來穩居服務端套用程式語言使用率第一的寶座。
同時,JVM是一個開源的產品,在技術體系上也是開放的,當然,並不是無條件的開放,而是在統一的技術規範下,不對實現做任何約束。因此各種基於JVM規範的程式語言也得以被發明出來,例如Scala、Clojure、Groovy等,甚至PHP、Ruby等程式也可以轉換到JVM規範。不管高級程式語言是Java還是Scala,只要能夠被翻譯成
Java位元組碼,JVM都能夠執行,這便是技術規範的開放性。
雖然Java與JVM在最近這些年取得了巨大的成功,但是也並非沒有缺點。例如Java是一種嚴格的面向對象設計的程式語言,一切編程要素都被嚴格編寫在Java類型內部,你不可能像C語言那樣,直接在源程式中定義一個函式。這種完全的面向對象設計的特性也給Java自己造成了很多不便,例如無法對底層類庫進行擴展,除非你去繼承並實現一個新的類型。
同時,Java程式語言的語法太過於嚴格和死板,不像很多其他程式語言那樣,有不少讓人心動的功能特性,這種死板和嚴格往往會造成工作效率的低下。
於是,Kotlin誕生了。
當筆者剛看到Kotlin時,並沒有多少驚訝。因為Kotlin底層仍然是基於JVM虛擬機的,主要是“仍然”喲!因為基於JVM的程式語言太多了,它們都有自己的“脾氣”和鮮明的“性格”,很難說誰比誰好。更何況,筆者剛剛讀完了JVM底層的原始碼,並彙編成書——《揭秘Java虛擬機:JVM設計原理與實現》(有興趣的讀者可以上淘寶、京東、亞馬遜、噹噹等主流平台上選購),因此筆者並沒有覺得Kotlin會“玩”出啥新的花樣來。然而,隨著對Kotlin特性了解的加深,筆者越來越發現Kotlin真的不是隨隨便便搞出來的一個全新的程式語言——如果你有多年的編程開發經驗,並且熟知很多的程式語言,你會對Kotlin感到很驚訝!因為這真的是一門融合了眾多程式語言特性的程式語言,並且是在不違反JVM規範的基礎上,將其他眾多語言的特性融入了進來,說其是博採眾家之長,一點也不為過。
在驚訝之餘,筆者將對Kotlin的理解寫了下來,並形成了本書。本書著重為你介紹Kotlin各種高級特性背後的實現機制,希望我們可以一起探討Kotlin背後的設計哲學。
本書主要從封裝、繼承和多態這三方面介紹Kotlin的面向對象設計的語法特性及其背後的實現方式。
其中詳細講解了Kotlin在面向對象封裝方面所作出的努力,Kotlin保留了Java封裝好的一面,勇敢地摒棄了其不好的一面,例如對靜態欄位和方法的捨棄與變通。而在方法封裝上,Kotlin更是玩出了新花樣,打破了Java封裝的徹底性,讓Java開發者可以體驗“面向過程”編程的感覺。同時,Kotlin充分吸收其他程式語言中的好的語言特性,提供了諸如VB語言中的“with語法”。
在繼承方面,Kotlin也有自己的思考,其綜合了Java和C++等面向對象程式語言繼承的優缺點,設計出自己的一套獨特的繼承機制。不過Kotlin依然保留了Java語言中一個類不能同時繼承多個類的強制約束。
Kotlin給人最多的驚艷,都集中在“多態”這一領域。其中,最讓筆者驚嘆的便是Kotiln提供了這樣一種能力:不用修改原有類,也無須通過繼承的方式,就能為某個類增加新的行為。雖然Kotlin僅僅是取巧,僅僅實現了一個語法糖的包裝,但是這種小的改變卻秀出了“美”的新高度。或許,這都不能算是繼承,這裡姑且將其與繼承混為一談吧。
另外,操作符重載也是Kotlin中一個非常驚艷的功能,給了筆者不小的衝擊力——也許是知識的貧乏限制了筆者的想像力。
如果僅僅講解Kotlin的語法,多么無聊。所以,本書並沒有隻停留於以往內容層面的介紹,作為一名對技術抱有極大熱情、凡事喜歡刨根問底的極客(姑且是往自己臉上貼金吧^_^),筆者進一步研究了Kotlin各種高級特性背後的實現機制。本書主要揭示了Kotlin中屬性包裝、多種形態的函式定義及各種特殊類型的定義等背後的實現機制。由於Kotlin並沒有自己的虛擬機,而是完全託管於JVM虛擬機,所以Kotlin最多只能將技術玩到“Java位元組碼”這一層,而筆者對此則是再熟悉不過的。
本書適合各種程式語言的開發者閱讀,不管你是使用Java、Kotlin、Android開發,還是使用PHP、JSP開發,甚至是使用C、C++、VB、GO開發,都可以閱讀本書。因為你總會從本書中讀到一些熟悉的語言特性,當你看到Kotlin中也有這樣一種特性的時候,你一定會心一笑!