本系列文章來(lái)學(xué)習(xí) Kotlin 和 Anko 插件 通過(guò) Kotlin 開(kāi)發(fā)一個(gè) Android 項(xiàng)目。
Kotlin-Anko學(xué)習(xí)(1) Kotlin、Anko 介紹
Kotlin-Anko學(xué)習(xí)(2) Kotlin 語(yǔ)法基礎(chǔ)-基本類型
Kotlin-Anko學(xué)習(xí)(3) Kotlin 語(yǔ)法基礎(chǔ)-關(guān)鍵字 package、Import、if、when、for、while、return、break、continue
Kotlin-Anko學(xué)習(xí)(4) Kotlin語(yǔ)法-類、繼承、抽象類
Kotlin-Anko學(xué)習(xí)(5) Kotlin語(yǔ)法-屬性、字段、接口
Kotlin官方資訊
2017年11月28日 KotlinConf 大會(huì)宣布了 Kotlin 1.2 RC 版,并宣布 Kotlin/Native 已支持用于開(kāi)發(fā) iOS 應(yīng)用和 Web 應(yīng)用開(kāi)發(fā)。新特性如下
Kotlin語(yǔ)法
Kotlin 語(yǔ)法的學(xué)習(xí)僅圍繞著 Android 展開(kāi),本來(lái)不打算寫(xiě)基礎(chǔ)語(yǔ)法的,自己學(xué)習(xí)后感覺(jué)腦袋還是萌萌噠,所以決定記錄一篇自己學(xué)習(xí)筆記,方便后續(xù)查閱,推薦直接通過(guò)官網(wǎng)學(xué)習(xí),官方中文網(wǎng)和官方英文版結(jié)合學(xué)習(xí),有些翻譯過(guò)來(lái)的不好理解,還是直接看英文文檔比較好,并可以提高自己閱讀英語(yǔ)的能力,在語(yǔ)法學(xué)習(xí)階段我采用Kotlin網(wǎng)頁(yè)版編譯工練習(xí)。不足之處請(qǐng)多多留言指正,相互學(xué)習(xí)。
Kotlin 基本類型
kotlin中一切皆對(duì)象,Kotlin中的基本類型分為:數(shù)字、字符、布爾值、數(shù)組、字符串。
1. 數(shù)字:Kotlin內(nèi)置了6種類型表示數(shù)字
- 數(shù)字類型:Double|64位 、Float|32位 、Long|64位、Int|32位 、Short|16位、Byte|8位。(字符不是數(shù)字)
- 字面常量:十進(jìn)制 :123 123L(Long類型)、十六進(jìn)制:0x0F、二進(jìn)制: 0b00001011。(不支持8進(jìn)制)
- 支持?jǐn)?shù)字字面值中的下劃線:如
> val oneMillion = 1_000_000
> val creditCardNumber = 1234_5678_9012_3456L
> val socialSecurityNumber = 999_99_9999L
> val hexBytes = 0xFF_EC_DE_5E
> val bytes = 0b11010010_01101001_10010100_10010010
-
表示方式:數(shù)字的物理存儲(chǔ)為 JVM 的原生類型,但可空的引用( Int?)或泛型 會(huì)將數(shù)字裝箱,如圖:
數(shù)字裝箱這里數(shù)字裝箱有兩個(gè)特征:不必保持同一性,保留了相等性。
- 顯式轉(zhuǎn)換:不支持較小的數(shù)據(jù)轉(zhuǎn)換為較大的數(shù)據(jù)(隱式),可以通過(guò)顯式轉(zhuǎn)換 如:val i: Int = b.toInt() // OK: 顯式拓寬,但特殊情況也有:算術(shù)運(yùn)算有重載做適當(dāng)?shù)霓D(zhuǎn)換,根據(jù)上下文推斷 如:val l = 1L + 3 // Long + Int => Long。每個(gè)數(shù)字類型都支持如下的顯式轉(zhuǎn)換:
> toByte(): Byte
> toShort(): Short
> toInt(): Int
> toLong(): Long
> toFloat(): Float
> toDouble(): Double
> toChar(): Char
- 運(yùn)算:Kotlin支持?jǐn)?shù)字運(yùn)算的標(biāo)準(zhǔn)集,完整的位運(yùn)算(只用于 Int 和 Long) 如下:
> shl(bits) – 有符號(hào)左移 (Java 的 <<)
> shr(bits) – 有符號(hào)右移 (Java 的 >>)
> ushr(bits) – 無(wú)符號(hào)右移 (Java 的 >>>)
> and(bits) – 位與
> or(bits) – 位或
> xor(bits) – 位異或
> inv() – 位非
- 浮點(diǎn)數(shù)比較:靜態(tài)已知的 Float 或 Double 或者它們對(duì)應(yīng)的可空類型(聲明為該類型,或者推斷為該類型,或者智能類型轉(zhuǎn)換的結(jié)果是該類型),兩數(shù)字所形成的操作或者區(qū)間遵循 IEEE 754 浮點(diǎn)運(yùn)算標(biāo)準(zhǔn)。如下:
> 相等性檢測(cè):a == b 與 a != b
> 比較操作符:a < b、 a > b、 a <= b、 a >= b
> 區(qū)間實(shí)例以及區(qū)間檢測(cè):a..b、 x in a..b、 x !in a..b
> BUT:為了支持泛型場(chǎng)景并提供全序支持,當(dāng)這些操作符并非靜態(tài)類型為浮點(diǎn)數(shù)(例如是 Any、 Comparable<……>、 類型參數(shù))時(shí),這些操作使用為 Float 與 Double 實(shí)現(xiàn)的不符合標(biāo)準(zhǔn)的 equals 與 compareTo,這會(huì)出現(xiàn):
> 認(rèn)為 NaN 與其自身相等
> 認(rèn)為 NaN 比包括正無(wú)窮大(POSITIVE_INFINITY)在內(nèi)的任何其他元素都大
> 認(rèn)為 -0.0 小于 0.0
2. 字符:Kotlin 字符用 Char 類型表示 不能直接轉(zhuǎn)數(shù)字(c: Char ==1類型不同不能比較 通過(guò)單引號(hào)引用 c: Char == '1')
- 特殊字符:\t、 \b、\n、\r、'、"、\ 和 $ 通過(guò) \ 進(jìn)行轉(zhuǎn)義
- 其他字符通過(guò)Unicode 轉(zhuǎn)義序列語(yǔ)法:'\uFF00'
- 支持顯式轉(zhuǎn)換Int數(shù)字:'1'.toInt()
- 通過(guò)空引用,字符會(huì)被裝箱,不會(huì)保留統(tǒng)一性
3. 布爾值:布爾用 Boolean 類型表示,它有兩個(gè)值:true 和 false。
- 內(nèi)置的布爾運(yùn)算 如下:
> || – 短路邏輯或
> && – 短路邏輯與
> ! - 邏輯非
- 需要可空引用布爾會(huì)被裝箱
4. 數(shù)組:Kotlin 中數(shù)組用 Array 類來(lái)表示
- 定義了 get 和 set 函數(shù)(按照運(yùn)算符重載約定這會(huì)轉(zhuǎn)變?yōu)?[])和 size 屬性 源碼:
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ……
}
-
數(shù)組定義的三種方式 如下:數(shù)組的定義.png
分別是:
> 使用接受數(shù)組大小和一個(gè)函數(shù)參數(shù)的 Array 構(gòu)造函數(shù)
> 使用庫(kù)函數(shù) arrayOf() 來(lái)創(chuàng)建一個(gè)數(shù)組并傳遞元素值給它
> 使用庫(kù)函數(shù) arrayOfNulls() 可以用于創(chuàng)建一個(gè)指定大小的、所有元素都為空的數(shù)組
- 注意:與 Java 不同的是,Kotlin 中數(shù)組是不型變的(invariant)。這意味著 Kotlin 不讓我們把 Array<String> 賦值給 Array<Any>,以防止可能的運(yùn)行時(shí)失敗,Kotlin 也有無(wú)裝箱開(kāi)銷的專門的類來(lái)表示原生類型數(shù)組: ByteArray、 ShortArray、IntArray 等等。這些類和 Array 并沒(méi)有繼承關(guān)系,但是它們有同樣的方法屬性集。它們也都有相應(yīng)的工廠方法。
5. 字符串:字符串用 String 類型表示
- 字符串是不可變的。 字符串的元素——字符可以使用索引運(yùn)算符訪問(wèn): s[i] 如下:
//for 循環(huán)迭代字符串
for (c in str) {
println(c)
}
- 字符串字面值 如下代碼:
fun main(args: Array<String>) {
//① 轉(zhuǎn)義字符串可以有轉(zhuǎn)義字符,以及原生字符串可以包含換行和任意文本
val s = "Hello, world!\n"
print(s)
print('\n')
//② 原生字符串 使用三個(gè)引號(hào)(""")分界符括起來(lái),內(nèi)部沒(méi)有轉(zhuǎn)義并且可以包含換行和任何其他字符
val text = """
for (c in "foo")
print(c)"""
print(text)
print('\n')
//與③進(jìn)行對(duì)比
val text1 = """
|Tell me and I forget.
|Teach me and I remember.
"""
print(text1)
print('\n')
print('\n')
//③ 你可以通過(guò) trimMargin() 函數(shù)去除前導(dǎo)空格
val text2 = """
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
print(text2)
print('\n')
print('\n')
// ④ 默認(rèn) | 用作邊界前綴,但你可以選擇其他字符并作為參數(shù)傳入,比如 trimMargin(">")。
val text3 = """
>Tell me and I forget.
>Teach me and I remember.
""".trimMargin(">")
print(text3)
}
運(yùn)行結(jié)果:
-
字符串模板:模板表達(dá)式以美元符($)開(kāi)頭 用于加入表達(dá)式 如下:$符號(hào)的使用


