Kotlin學習教程(三)

Kotlin學習教程(三)

前面介紹了基本語法和編碼規範後,接下來學習下基本類型。

Kotlin中,所有東西都是對象,在這個意義上講我們可以在任何變量上調用成員函數和屬性。 一些類型可以有特殊的內部表示——例如,
數字、字符和布爾值可以在運行時表示爲原生類型值,但是對於用戶來說,它們看起來就像普通的類。 在本節中,我們會描述Kotlin中使用的基本類型:
數字、字符、布爾值、數組與字符串。

數字

Kotlin處理數字在某種程度上接近Java,但是並不完全相同。例如,對於數字沒有隱式拓寬轉換(如Javaint可以隱式轉換爲long),
另外有些情況的字面值略有不同。

Kotlin提供瞭如下的內置類型來表示數字:

Type    Bit width
Double  64
Float   32
Long    64
Int     32
Short   16
Byte    8
````

注意在`Kotlin`中字符不是數字,字符用`Char`類型表示。它們不能直接當作數字






<div class="se-preview-section-delimiter"></div>

### 字面常量

數值常量字面值有以下幾種:   
- 十進制:123
- `Long`類型用大寫`L`標記:`123L`
- 十六進制:`0x0F`
- 二進制:`0b00001011`

注意: 不支持八進制

`Kotlin`同樣支持浮點數的常規表示方法:   

默認`double`:123.5、123.5e10,`Float``f`或者`F`標記:`123.5f`

你可以使用下劃線使數字常量更易讀





<div class="se-preview-section-delimiter"></div>

```kotlin
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

引用相等

引用相等由===以及其否定形式!===操作判斷。a === b當且僅當ab指向同一個對象時求值爲true

結構相等

結構相等由==以及其否定形式!==操作判斷。按照慣例,像a == b這樣的表達式會翻譯成
a?.equals(b) ?: (b === null)
也就是說如果a不是null則調用equals(Any?)函數,否則即anull檢查b是否與null引用相等。

val a: Int = 10000
print(a === a) // 輸出“true”
val boxedA: Int? = agaomnh
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 // 錯誤

我們可以顯式轉換來拓寬數字

val i: Int = b.toInt() // OK: 顯式拓寬

每個數字類型支持如下的轉換:

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

運算

這是完整的位運算列表(只用於IntLong):

shl(bits) – 有符號左移 (Java 的 <<)
shr(bits) – 有符號右移 (Java 的 >>)
ushr(bits) – 無符號右移 (Java 的 >>>)
and(bits) – 位與
or(bits) – 位或
xor(bits) – 位異或
inv() – 位非
相等性檢測:a == b 與 a != b
比較操作符:a < b、 a > b、 a <= b、 a >= b
區間實例以及區間檢測:a..b、 x in a..b、 x !in a..b
|| – 短路邏輯或
&& – 短路邏輯與
! - 邏輯非

字符串

字符串用String類型表示。字符串是不可變的。字符串的元素——字符可以使用索引運算符訪問:s[i]。可以用for循環迭代字符串:

for (c in str) {
    println(c)
}

Kotlin有兩種類型的字符串字面值: 轉義字符串可以有轉義字符,以及原生字符串可以包含換行和任意文本。轉義字符串很像Java字符串:

val s = "Hello, world!\n"

轉義採用傳統的反斜槓方式。

原生字符串 使用三個引號"""分界符括起來,內部沒有轉義並且可以包含換行和任何其他字符:

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

你可以通過trimMargin()函數去除前導空格:

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 s = "abc"
val str = "$s.length is ${s.length}" // 求值結果爲 "abc.length is 3"

更多文章請查看AndroidNote

你的star是我的動力!!!

發佈了134 篇原創文章 · 獲贊 23 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章