Kotlin學習教程(三)
前面介紹了基本語法和編碼規範後,接下來學習下基本類型。
在Kotlin
中,所有東西都是對象,在這個意義上講我們可以在任何變量上調用成員函數和屬性。 一些類型可以有特殊的內部表示——例如,
數字、字符和布爾值可以在運行時表示爲原生類型值,但是對於用戶來說,它們看起來就像普通的類。 在本節中,我們會描述Kotlin
中使用的基本類型:
數字、字符、布爾值、數組與字符串。
數字
Kotlin
處理數字在某種程度上接近Java
,但是並不完全相同。例如,對於數字沒有隱式拓寬轉換(如Java
中int
可以隱式轉換爲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
當且僅當a
和b
指向同一個對象時求值爲true
。
結構相等
結構相等由==
以及其否定形式!==
操作判斷。按照慣例,像a == b
這樣的表達式會翻譯成
a?.equals(b) ?: (b === null)
也就是說如果a
不是null
則調用equals(Any?)
函數,否則即a
是null
檢查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
運算
這是完整的位運算列表(只用於Int
和Long
):
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"
- 郵箱 :[email protected]
- Good Luck!
val s = "abc"
val str = "$s.length is ${s.length}" // 求值結果爲 "abc.length is 3"
你的star
是我的動力!!!