Kotlin
kotlin來源
Kotlin 來源于一個島嶼的名字,全稱是 Kotlin Island,是英語「科特林島」之意,這個小島屬于俄羅斯。
2010 年 :JetBrains 著手開發(fā) Kotlin。
2011 年 7 月 :JetBrains 公開宣布 Kotlin。
2012 年 2 月 :JetBrains 在 Apache 2 許可證下開源了 Kotlin 的源碼。目前 Kotlin 的官方源代碼在 Github 上 https://github.com/JetBrains/kotlin 。
2016 年 2 月 :JetBrains 發(fā)布了 Kotlin 1.0 版,算是比較穩(wěn)定的正式版。許諾之后一直會保持向后兼容。
2017 年目前最新版本 :1.1.2(2017 年 6 月)。相比 Kotlin 1.0 版本時,和 Kotlin 有關(guān)的代碼數(shù)目從 210 萬行飛升到 1000 多萬行。
2017.05.08Google I/O大會宣布Kotlin作為Android官方開發(fā)語言,親兒子。。
Kotlin和java一樣是基于JVM的語言
kotlin與java7相比 優(yōu)勢到底是什么?
- 它更加易表現(xiàn):這是它最重要的優(yōu)點(diǎn)之一。你可以編寫少得多的代碼。
- 它更加安全:Kotlin是空安全的,也就是說在我們編譯時期就處理了各種null的 情況,避免了執(zhí)行時異常。如果一個對象可以是null,則我們需要明確地指定 它,然后在使用它之前檢查它是否是null。你可以節(jié)約很多調(diào)試空指針異常的 時間,解決掉null引發(fā)的bug。
- 它是函數(shù)式的:Kotlin是基于面向?qū)ο蟮恼Z言。但是就如其他很多現(xiàn)代的語言 那樣,它使用了很多函數(shù)式編程的概念,比如,使用lambda表達(dá)式來更方便地 解決問題。其中一個很棒的特性就是Collections的處理方式。
- 它可以擴(kuò)展函數(shù):這意味著我們可以擴(kuò)展類的更多的特性,甚至我們沒有權(quán)限 去訪問這個類中的代碼。
- 它是高度互操作性的:你可以繼續(xù)使用所有的你用Java寫的代碼和庫,因?yàn)閮?個語言之間的互操作性是完美的。甚至可以在一個項(xiàng)目中使用Kotlin和Java兩 種語言混合編程。
- 它可以多平臺開發(fā):基于 JVM 的開發(fā),Android 開發(fā),Web 開發(fā),Native(原生)開發(fā)。其中 Web 開發(fā)可以結(jié)合 spring 框架,而且 Kotlin 也可以編譯生成 JavaSript 模塊,可以在一些 JavaScript 的虛擬機(jī)上編譯。Native 開發(fā)就更牛了,目前 Kotlin 官方在 Github 開源了 Native 開發(fā)的源碼 https://github.com/JetBrains/kotlin-native,基于 LLVM(Low Level Virtual Machine 的縮寫,表示「底層虛擬機(jī)」。LLVM 是一種編譯器基礎(chǔ)設(shè)施,以 C++ 寫成。它是為了任意一種編程語言而寫成的程序,利用虛擬技術(shù)創(chuàng)造出編譯時期、鏈接時期、運(yùn)行時期以及閑置時期的最優(yōu)化)的后端,方便為各個平臺編寫原生應(yīng)用,比如為 Mac OS,iOS,Linux,嵌入式系統(tǒng),等等
參考資料:http://blog.csdn.net/weixin_37730482/article/details/73558216
基本類型
1.kotlin支持的基本類型:
Double Float Long Int Short Byte
<!--其中Byte不是數(shù)值類型, kotlin中每個類型都是一個對象, kotlin不支持8進(jìn)制-->
數(shù)字類型不會自動轉(zhuǎn)型,比如 不能給Long類型變量分配一個Int值,如果要賦值一個Int類型的必須要做明確的類型轉(zhuǎn)換,每一種基礎(chǔ)類型都有轉(zhuǎn)型的方法:
val int :Int = 1
val long :Long =i.toLong()
在kotlin中定義變量時使用(kotlin中聲明變量有兩種方式,使用var聲明的是可變變量,可以重新賦值,val聲明的類似java中的final修飾的常量):
var c = 'c'//kotlin中可以通過值推斷出變量的類型,所以我們的類型通??梢允÷缘?var int = 12
var long =121L
val string = "hello,wordl"http://不可變變量
數(shù)值類型的變量支持添加下劃線:
val one_million = 1_000_000
val id_card=411_325_1988_0926_5036L
字符(char) 不能直接作為一個數(shù)字處理,在使用時可以轉(zhuǎn)換為一個數(shù)字
val c :Char = 'c'
cal cToInt :Int = c.toInt()
2.數(shù)組:
數(shù)組 在kotlin中 數(shù)組由Array類表示,我們可以通過arr
ayOf(1,2,3)這種方式來創(chuàng)建數(shù)組:
var array: Array<Int> = arrayOf(1, 2, 3)
var arrayOfNulls: Array<Int?> = arrayOfNulls(5)//可以指定一個定長的空數(shù)組
var arrayOfIndex: Array<Int> = Array(5, { i -> (i * i) })//可以構(gòu)建一個通過數(shù)組索引產(chǎn)生數(shù)組元素值的數(shù)組
3.String 字符串
kotlin中的字符串字面量分為兩種
val s = "hello , world \n"
// 一種是""包裹的,這種字符串與java里的String 類似 可以識別轉(zhuǎn)義字符
//另一種是不識別特殊字符,寫什么就是什么的 字符串 所以這個注釋不能跟到下面一行的后面- -
val text = """
for(c in "foo"){
print(c)
}
\r \n
"""http://上面這個字符串可以用trimMargin來去除開頭的空格
text.trimMargin()
字符串模版
println("text = $text1")//可以直接用$跟變量
println("text = ${text1.length}")//也可以直接用${}包裹表達(dá)式
一個String可以像數(shù)組那樣被迭代訪問:
val string = "Hello,World"
val c = string[2]//這是字符'l'
for(c in string){
println(c)
}
屬性
Kotlin中的屬性與java中的屬性相同,不過屬性自實(shí)現(xiàn)了getter和setter。如果沒有任何制定,屬性會默認(rèn)使用getter和setter
class Person{
var name :String = ""
}
val person = Person()
person.name = "lisi"http://Kotlin中默認(rèn)已經(jīng)實(shí)現(xiàn)了getter setter
val name = person.name
如果想要修改默認(rèn)的getter 和 setter,可以這樣做:
class Person{
var name :String = ""
get() = field.toUpperCase()
set(value) {
field = "Name:$value"
}
}
修改了getter和setter之后,就會再調(diào)用屬性時按照修改后的調(diào)用getter和setter
當(dāng)我們直接調(diào)用屬性的時候不是直接訪問類的屬性,而是調(diào)用了getter 和setter方法。
Android中的耗時操作需要在子線程中運(yùn)行,使用java時可以通過new Thread 或者Rxjava來進(jìn)行異步處理。
在kotlin中,使用Anko庫可以
async{
Request("url"
).run()//在子線程運(yùn)行的
uiThread { toast("request success") }//uiThread是在主線程中運(yùn)行的,uiThread可以依賴于調(diào)用者,如果它是被一個Activity調(diào)用的,
//如果activity.isFinishing()返回true,uiThread就不會被執(zhí)行了。這樣就不會在Activity銷毀時崩潰了。
}
修飾符
可見性修飾符
Kotlin中的可見性修飾符與java中有一些不同,
kotlin修飾符有五種 :
public private protected default//和java一樣的四種
internal// kotlin多出了一種模塊module級別的internal,一個module中不能跨module訪問方法和變量
在Kotlin中默認(rèn)的可見性修飾符是public
Kotlin中的null安全
在java中 類似 String nullStr = null; nullStr.length() ;
該代碼可以被編譯,但是在運(yùn)行時會拋出NullPointerException,這樣相當(dāng)不安全
指定一個變量是可null是通過在類型的最后增加一個問號,因?yàn)樵趉otlin中一切都是對象,一切都是可null的。
val a : String? = null
一個可null類型,在沒有進(jìn)行檢查之前你是不能直接使用它的()。還有一個特性是當(dāng)我們檢查了一個對象的可null性,之后這個對象就會自動轉(zhuǎn)型成不可null類型。這就是kotlin編譯器的智能轉(zhuǎn)換。
(Kotlin for android developer 140)
如果我們不需要是用null引用,可以使用安全訪問操作符(?),使用之后只有引用不為null才會執(zhí)行代碼,否則不做任何操作。
我們可以使用Elivs Operator(?:),類似三元表達(dá)式
val length = a?.length?:-1
//如果不為null,返回a.length,如果為null返回-1
有一種情況是,我們明確的知道我們使用的是不null變量,但是他的類型卻是可null的。我們可以直接是用!!操作符強(qiáng)制編譯器執(zhí)行可null類型時跳過限制檢查。
val a :String? = null;
a!!.length//這里明顯會崩潰,所以我們使用!!來強(qiáng)制執(zhí)行的時候,要確保對象非null。
<!--KotlinNullPointerException-->