Kotlin-Anko學(xué)習(xí)(2) Kotlin語(yǔ)法基礎(chǔ)-基本類型

本系列文章來(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é)果:
字符串的4個(gè)特點(diǎn)運(yùn)行結(jié)果
  • 字符串模板:模板表達(dá)式以美元符($)開(kāi)頭 用于加入表達(dá)式 如下:
    $符號(hào)的使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容