Android:Kotlin詳細入門學習指南-基本類型-基礎語法(二)

本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新

Android:Kotlin詳細入門學習指南-基本類型-基礎語法(二)

在 Kotlin 中,所有變量的成員方法和屬性都是一個對象。一些類型是內建的,它們 的實現是優化過的,但對用戶來說它們就像普通的類一樣。

數值,字符,布爾,以及數組。

數值

Kotlin 處理數值的方法和 java 很相似,但不是完全一樣。比如,不存在隱式轉換數 值的精度,並且在字面上有一些小小的不同。
Kotlin 提供瞭如下內建數值類型(和 java 很相似):



注意字符在 Kotlin 中不是數值類型
字面值常量
主要是以下幾種字面值常量:

  • 十進制數值: 1234
  • 長整型要加大寫 L : 1234L
  • 16進制: 0x0f
  • 二進制: 0b00001011

注意不支持8進制
Kotlin 也支持傳統的浮點數表示:

  • 默認雙精度浮點數(Double) : 1234.5 , 1234.5e10
  • 單精度浮點數(Float)要添加 f 或 F :1234.5f

數值常量中可以添加下劃線分割(1.1版本新特性)
您可以使用下劃線增加數值常量的可讀性:

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

在 java 平臺上,數值被 JVM 虛擬機以字節碼的方式物理存儲的,除非我們需要做 可空標識(比如說 Int?) 或者涉及泛型。在後者中數值是被裝箱的。
注意裝箱過的數值是不保留特徵的:

val a: Int = 10000 
print (a === a ) // 打印 'true' 
val boxedA: Int? = a 
val anotherBoxedA: Int? = a 
print (boxedA === anotherBoxedA ) // 注意這裏打印的是 'false'

另一方面,它們是值相等的:

val a: Int = 10000 
print(a == a) // 打印 'true' 
val boxedA: Int? = a 
val anotherBoxedA: Int? = a 
print(boxedA == anotherBoxedA) // 打印 'true'

顯式轉換
由於不同的表示,短類型不是長類型的子類型。如果是的話我們就會碰到下面這樣 的麻煩了

 val a: Int? =1 // 一個裝箱過的 Int (java.lang.Integer) 
 val b: Long? = a // 一個隱式裝箱的 Long (java.lang.Long)
print( a == b )// 很驚訝吧 這次打印出的是 'false' 這是由於 Long 類型 的 equals() 只有和 Long 比較纔會相同

因此不止是恆等,有時候連等於都會悄悄丟失。
所以,短類型是不會隱式轉換爲長類型的。這意味着我們必須顯式轉換才能把 Byte 賦值給 Int

val b: Byte = 1 // OK, 字面值常量會被靜態檢查 
val i: Int = b // ERROR

以通過顯式轉換把數值類型提升

val i: Int = b.toInt() // 顯式轉換

每個數值類型都支持下面的轉換:

toByte(): Byte 
toShort(): Short 
toInt(): Int 
toLong(): Long 
toFloat(): Float 
toDouble(): Double 
toChar(): Char

隱式轉換一般情況下是不容易被發覺的,因爲我們使用了上下文推斷出類型,並且 算術運算會爲合適的轉換進行重載,比如

val l = 1.toLong + 1 // Long + Int => Long
運算符

Kotlin支持標準的算術運算表達式,這些運算符被聲明爲相應類的成員(但是編譯器 將調用優化到相應的指令)。
至於位運算,Kotlin 並沒有提供特殊的操作符,只是提供了可以叫中綴形式的方 法,

val x = (1 shl 2) and 0x000FF000

下面是全部的位運算操作符(只可以用在 Int 和 Long 類型):

  • shl(bits) – 有符號左移 (相當於 Java’s << )
  • shr(bits) – 有符號右移 (相當於 Java’s >> )
  • ushr(bits) – 無符號右移 (相當於 Java’s >>> )
  • and(bits) – 按位與
  • or(bits) – 按位或
  • xor(bits) – 按位異或
  • inv(bits) – 按位翻轉
字符

字符類型用 Char 表示。不能直接當做數值來使用
字符是由單引號包裹的'1',特殊的字符通過反斜槓\轉義,下面的字符序列支持轉 義: \t , \b , \n , \r , ' , " , \ 和 $ 。編碼任何其他字符,使用 Unicode 轉義語法: \uFF00 。
將字符顯示的轉義爲Int數字:

fun decimalDigitValue(c: Char): Int { 
    if (c !in '0'..'9') 
    throw IllegalArgumentException("Out of range") 
    return c.toInt() - '0'.toInt() //顯示轉換爲數值類型 
}

和數值類型一樣,需要一個可空引用時,字符會被裝箱。特性不會被裝箱保留。

布爾值

布爾值只有 true 或者 false
如果需要一個可空引用,則可以將布爾值裝箱
布爾值的內建操作包括

  • || – 短路或
  • && – 短路與
  • ! - 取反
數組

數組在 Kotlin 中由 Array 類表示,有 get 和 set 方法(通過運算符重載可以 由[]調用),以及 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> 
    // ... 
}

我們可以給庫函數 arrayOf() 傳遞每一項的值來創建Array, arrayOf(1, 2, 3) 創建了一個[1, 2, 3] 這樣的數組。也可以使用庫函數 arrayOfNulls() 創建 一個指定大小的空Array。
或者通過指定Array大小並提供一個通過索引產生數組元素值的工廠函數:

// 創建一個 Array<String> 內容爲 ["0", "1", "4", "9", "16"] 
val asc = Array(5, {i -> (i * i).toString() })

[] 操作符表示調用 get() set() 函數
注意:和 java 不一樣,arrays 在 kotlin 中是不可變的。這意味 kotlin 不允許我們 把 Array.String轉爲 Array.Any,這樣就阻止了可能的運行時錯誤(但你可 以使用 Array.outAny.
Kotlin 有專門的類來表示原始類型從而避免過度裝箱: ByteArray, ShortArray, IntArray 等等。這些類與 Array 沒有繼承關係,但它們有一樣的方法與屬性。每個 都有對應的庫函數:

val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2]
字符串

字符串是由 String 表示的。字符串是不變的。字符串的元素可以通過索引操作 讀取: s[i] 。字符串可以用 for 循環迭代:

for (c in str) { 
    println(c) 
}
字符串字面量

Kotlin 有兩種類型的字符串字面量:一種是可以帶分割符的,一種是可以包含新行 以及任意文本的。帶分割符的 string 很像 java 的 string:

val s = "Hello World!\n"

轉義是使用傳統的反斜線的方式。
整行String 是由三個引號包裹的( """ ),不可以包含分割符但可以包含其它字符:

val text = """ 
    for (c in "foo") 
        print(c)
"""

可以通過trim-margin()函數移除空格:

val text = """ 
|Tell me and I forget. 
|Teach me and I remember. 
|Involve me and I learn. 
|(Benjamin Franklin) 
""".trimMargin()
字符串模板

字符串可以包含模板表達式,即可求值的代碼片段,並將其結果連接到字符串中。 一個模板表達式由一個 $ 開始幷包含另一個簡單的名稱:

val i = 10 
val s = "i = $i" // 求值爲 "i = 10"

或者是一個帶大括號的表達式:

val s = "abc" 
val str = "$s.length is ${s.length}" // 求值爲 "abc.length is 3"

模板既可以原始字符串中使用,也可以在轉義字符串中使用。如果需要在原始字符 串(不支持反斜槓轉義)中表示一個文字$字符,那麼可以使用以下語法:

val price = """ 
    ${'$'}9.99 
"""

這篇文章主要分享Kotlin的基本類型與java的區別。

本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章