Kotlin 已經出來較長一段時間了,有些同窗已經對Kotlin進行了深刻的學習,甚至已經運用到了本身的項目當中,可是還有較多同窗可能只是聽過Kotlin或簡單瞭解過,這篇文章的目的是讓這些同窗對Kotlin有一個系統全面的認識,讓有興趣的同窗在以後學習的時候能更加的輕車熟路。html
跟java,c同樣的強類型語言,變量的數據類型在編譯時肯定。對比的JavaScript,python則是動態編程語言。java
一家捷克的軟件公司,是著名的IDE開發商,對不少的開發語言和平臺都提供了相應的集成開發環境,好比Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成開發環境,被稱爲目前最好用的java IDE。並且Android Studio就是Google基於IntelliJ IDEA 開發的,因而可知Google和JetBrains的合做也是比較密切的。而從以上說明也能夠看到JetBrains不只實力強勁,這家公司對於語言設計更是有自然優點。Kotlin是集多家語言之大成。python
咱們在GitHub上能夠下載Kotlin的所有源代碼。並且能夠本身進行代碼修改,再發布。android
https://github.com/JetBrains/kotlin git
最新版本已經更新到了1.2.3 。程序員
JetBrains其實在2011年就推出了Kotlin, 在以後的很長一段時間都處於設計,開發和完善當中,2016年才發佈第一個正式版本,而在2017年5月份的Google I/O開發者大會上,被Google宣佈稱爲Android的官方開發語言。github
被程序員們稱爲Android平臺的Swift。編程
大量的語法糖(有函數聲明,類的建立,集合相關,範圍運算符等等大量簡潔的語法)、 Lambda表達式(Java8支持),簡潔的函數表示法,後面會介紹到。swift
可參考:http://qinghua.github.io/kotlin-syntax-suger/ 收集的語法糖們。segmentfault
吸取其餘語言的優勢有:模板字符串,運算符重載,方法擴展,命名參數等。後面在語言新特性中會講到。
空安全:避免空指針異常。當變量能夠爲null時,必須使用可空安全符?進行聲明,不然會出現編譯錯誤。聲明變量爲可空後,在運行時便不會拋出異常。
類型智能轉換:經過is進行類型判斷後,編譯器自動進行類型轉換。父類引用能夠調用子類接口,注意轉換隻在is的代碼塊中生效。
相似於swift於OC的關係,雖然官方推薦使用新語言Kotlin進行Android開發,可是前提新語言必須兼容舊語言(不然是沒法獲得google的承認的)。因此Kotlin的設計初衷就是要徹底兼容Java。
相互調用:使用Kotlin進行Android或者Java服務端開發,能夠導入任意的Java庫。Kotlin和Java之間能夠相互調用。
相互轉換:在Android Studio中能夠一鍵轉換Java代碼爲Kotlin代碼(Code > Convert Java File to Kotlin File.)。同時Kotlin代碼也能夠反編譯成Java代碼(1.Tools>Kotlin>Show Kotlin Bytecode 2.Decompile)。
Java的API = Kotlin的API。
JetBrains爲Kotlin的開發提供了大量的工具支持。咱們能夠直接下載Kotlin Compiler庫在命令行進行編譯和運行,也能夠經過安裝插件在Eclipse中使用Kotlin,而如今IntelliJ IDEA和Android Studio已經能夠直接使用Kotlin進行開發。就像JetBrains所說:一門語言須要工具化,而在 JetBrains,這正是咱們作得最好的地方!
Kotlin如何兼容Java?
咱們來看一張圖,瞭解Kotlin的編譯過程。
Kotlin爲何能夠兼容Java,一個主要緣由是Kotlin文件在通過Kotlin編譯器編譯後會生成Java字節碼。這跟Java文件經過Java編譯器編譯後生成的字節碼幾乎沒有區別,這樣JVM就能直接識別和處理Kotlin代碼的功能和邏輯。
當Kotlin調用Java代碼,Kotlin編譯器會對調用的Java文件進行分析,以便kt文件可以生成正確的class文件。爲何這麼說呢?舉個列子,Java字節碼有幾種函數調用的方式invokespecial 、 invokeStatic 、 invokeInterface等,編譯器必須知道調用的Java函數是什麼類型才能生成相應的正確的字節碼。而當在Java代碼中調用Kotlin對象時,Kotlin生成的class文件也要輸入到Java編譯器,這時Java文件才能生成正確的class文件。生成的class文件打成jar包後,最終能夠生成Android的APK,或供Java服務端調用。
咱們能夠直接下載下載Kotlin編譯器下來查看他的編譯過程(最新https://github.com/JetBrains/kotlin/releases/tag/v1.2.40-eap-16)。Kotlin編譯器的代碼都是用java寫的,因此使用Kotlin編譯器必需要有java環境。
Var用來聲明變量,Val相似Java final,用來聲明常量。語句後面不須要跟分號。變量類型能夠根據變量值進行自動推導。這裏Kotlin的基礎類型都是對象,使用的是Java的包裝類(基礎類型包裝成對象)。
函數使用fun爲關鍵字進行聲明。變量的冒號以後是變量類型,函數的冒號以後是返回值。
同時咱們能夠在定義函數的時候聲明參數的默認值。
函數調用的時候能夠直接調用,也可使用命名參數:
使用命名參數能夠增長可讀性,減小函數的重載。
類名的冒號表示繼承,全部類的基類稱爲Any(並非Object,只包含equals、hascode、toString方法)。聲明構造函數要指明constructor關鍵字。
也能夠直接在聲明類的時候指定構造函數。
對象實例化能夠不寫new關鍵字:
數據類,用來保存Info數據的類,其實就是JavaBeans。這裏使用一句代碼建立一個包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 類。
其餘流程控制基本跟Java差很少,這裏主要講下when表達式,他取代了Java的switch
when表達式其實最終是使用if/else來實現的。
保留了原來的for each循環,同時增長了區間控制
Kotlin的集合與OC的集合類似,分爲可變集合和不可變集合(lists、sets、maps 等)。
kotlin中的可變集合對Java的集合進行了包裝,同時它實現了一套不可變集合庫。
訪問:
Kotlin中沒有靜態屬性和方法。若是咱們要建立單列,可使用Object關鍵字聲明類。
若是要在一個類裏面聲明靜態成員,能夠在類的內部使用伴生對象。使用關鍵字companion object
調用的話,直接跟Java同樣,經過類名點屬性名稱或函數名稱調用。
Kotlin是如何實現空安全的呢?
在Kotlin中,對象聲明分爲可空引用和非空引用兩種。
非空引用:
可空引用:
安全調用操做符,寫做 ?. 可空調用:
經過函數調用給可空引用賦值,返回的必須也是可空引用。這就在編譯期間杜絕了空指針異常。可是這裏要注意一點,若是從Java返回的集合,不會強制作可空檢查,這個是時候若是給不可空引用賦值Java集合中的null會出現轉換錯誤異常。
跟OC的Category同樣,能夠對API的函數進行擴展。
咱們在任意Activity中均可以直接調用
函數擴展並非修改了原來的類,經過反編譯成Java代碼能夠發現,函數的擴展是經過靜態導入的方式實現的。
表示字符串中能夠包含變量或者表達式,以$符號開頭(這跟JSP的EL表達式有點像),好比:
Kotlin中是經過單引號進行轉義的
Kotlin爲基本的運算符提供了固定名稱函數表,好比
示例:
調用:
Lambda本質上是一個未聲明的函數,他會以表達式的形式傳遞。既然是函數,就由這三塊組成:參數 、 方法體 和 返回值。
咱們來看一下完整的Lambda表達式是怎麼寫的:
大括號內,箭頭左邊是參數,箭頭右側是方法體和返回值。這裏傳入兩個Int類型的參數,返回一個Int類型的值。
聲明一個接受函數爲參數的函數:
第二個參數rightV代表接受的是一個函數,函數有兩個Int型的入參,返回一個Int型的輸出。
調用:
在Android中使用Lambda表達式,能夠寫成
省略了函數的括號。這裏本來不是傳入函數類型參數,是編譯器作的處理。
注意:listener有多個接口聲明時,不能這麼使用,好比setOnCheckedChangeListener
把函數做爲參數或者是返回值的函數,Kotlin稱之爲高階函數。好比函數:
就是一個高階函數。能夠這麼調用:
咱們聲明一個局部函數,而後把他做爲參數傳遞給另外一個函數。咱們還可使用Lambda表達式來表示函數參數。
泛型的存在主要是爲了消除模板代碼和類型轉換安全, 在Kotlin中泛型的使用基本與Java是一致的。
在Java中泛型是不變的,好比:雖然A繼承B,但List<A>和List<B>之間沒有任何關係,Java是經過泛型通配符來實現型變的:
<? extends T> 對應Kotlin的 out T 生產者
<? super T> 對應Kotlin的 in T 消費者
PECS原則 : producer-extends, consumer-super
可是Kotlin中使用比Java的更加靈活,好比能夠在類聲明的時候添加型變 , 或者函數聲明的時候添加。
更多能夠了解:https://segmentfault.com/a/1190000010313252 寫的很是詳細。對Java泛型理解的不是很透徹能夠再看看 http://www.importnew.com/24029.html
在運行時獲取類的方法,屬性,類結構等全部信息。
1)Kotlin中使用Java的反射
jc返回的是Java的class對象,能夠經過這個對象去調用調用Java的反射。
2)Kotlin中的反射:
能夠不經過KClass對象,直接調用方法和訪問屬性(注意:若是有重載的函數或同名的屬性不能使用如下方式)。
什麼是協程?
協程是一種新的異步編程方式,它使用線程爲資源,基於代碼邏輯去實現任務之間的調度。它主要是由編譯器去實現的。
程序使用協程能夠書寫線性的異步代碼,沒有callback,大大簡化了異步編程。線程有的異步操做協程都支持,協程的掛起和切換很是輕量基本沒有開銷。
如何使用協程?
協程目前雖然還在試驗階段,可是功能已經很是完善了(如今Kotlin最新1.2.3版本,預計1.3會刪除實驗室狀態)。有興趣的同窗能夠參考:
https://www.kotlincn.net/docs/tutorials/coroutines-basic-jvm.html
Kotlin的不只僅用於Java,JetBrains的野心遠不止於此。使用Kotlin同時能夠用於其餘平臺的開發。因此市面上以前說Kotlin是一款基於JVM的語言是不許確的。
Kotlin用於服務端開發:
使用Kotlin可用於Java服務端開發。Java與Kotlin的相互兼容性,咱們可以使用服務端的任意框架,同時咱們能夠保留老的Java代碼,使用Kotlin編寫新代碼。Kotlin的協程特性更有助於構建服務端程序。IDE的支持和Sring框架的支持。
Kotlin用於Android開發:
Android Studio的支持。大量的實際案列。大量可學習的APP項目。與Java兼容性容許在 Kotlin 應用程序中使用全部現有的 Android 庫。
Kotlin用於JavaScript:
使用kotlinc-js編譯器將Kotlin代碼轉換爲JavaScript(不是Kotlin或標準庫的代碼編譯時會被忽略),Kotlin中提供了一些標準庫用於JS開發,同時可使用第三方JS庫。
Kotlin Native:
Kotlin/Native 是一種將 Kotlin 編譯爲沒有任何虛擬機的原生二進制文件的技術。還在開發中,如今只出了預覽版本。
預覽版本支持: Window 、 Mac 、 IOS 、 Android等平臺。Kotlin代碼最終會編譯成一個kexe文件,直接打開就能夠運行。
基於Kotlin/Native的一款遊戲源碼:https://github.com/jetbrains/kotlinconf-spinner
Kotlin 多平臺項目容許你將相同的代碼編譯到多個目標平臺。 目前支持的目標平臺爲 JVM 與 JS,即將增長 Native。
目前仍是1.2新版本的一個實驗性功能。
多平臺項目由三種類型的模塊組成:
● 公共模塊
公用模塊只包含與平臺無關的Kotlin代碼以及Kotlin公共標準庫代碼。同時還包含不含實現的平臺接口聲明。
● 平臺模塊
平臺模塊能夠依賴在指定平臺上可用的任何模塊與庫 (包括對於 Kotlin/JVM 平臺的 Java 庫與 Kotlin/JS 平臺的 JS 庫)。
● 經常使用模塊
與平臺模塊相互依賴的模塊
一、確實是一門很優秀的語言。語言簡潔,包含各類語言的優秀特性。可是一些亮點的特性包含協程和多平臺都處於試驗和開發階段。並不能吸引除Java,Android以外的更多開發者加入(JS平臺使用的人並很少)。
二、與Java的交互性,讓它可以依賴Java成長。可是對Java的依賴和兼容性註定沒法徹底替換Java。
三、雖然得到Google承認,可是Kotlin語言的熱度一直在逐漸降低,發文以前在TIOBE排行榜已經降至49位。我猜想雖然Kotlin得到經驗豐富的程序員的青睞,可是對於初中級選手來講他們更願選擇Java這門熟悉的語言。
四、潛力是巨大的,畢竟有Google的官方支持和JetBrains的強勁實力作支撐。若是以後Kotlin在多平臺等實驗室特性上有所突破的話,絕對會吸引更多的開發者。
1.Kotlin官網
2.kotlin中文官網
3.Google Kotlin項目學習實例
https://developer.android.com/samples/index.html?language=kotlin
4.阿里巴巴工程師教學系列文章
https://segmentfault.com/u/donghaichenguangjian
5.Kotlin協程
https://www.jianshu.com/p/9f720b9ccdea
https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md
https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md
6.其餘文章
https://blog.csdn.net/u013448469/article/details/79403284 Kotlin反射
https://blog.csdn.net/ztguang/article/details/72511994 Kotlin Native
騰訊WeTest自動化兼容測試提供雲端自動化兼容服務,提交雲端百臺真機,並行測試。快速發現遊戲/應用兼容性和性能問題,覆蓋安卓主流機型。目前已經支持全部騰訊在研和運營的手遊項目。
歡迎點擊連接:http://wetest.qq.com/product/auto-compatibility-testing 使用專家兼容測試服務。WeTest兼容性測試團隊期待與您交流!You Create,We Test!
騰訊WeTest有獎徵文活動進行中,歡迎投稿!瞭解詳情:http://wetest.qq.com/lab/view/379.html