本文是學習Kotlin的基本類型,Kotlin的基本類型與Java有一些不同,例如整數類型,Java是int
表示,而Kotlin是Int
表示;例如布爾類型,Java是boolean
表示,而Kotlin是用Boolean
表示。
在 Kotlin 中,所有變量的成員方法和屬性都是一個對象,我們可以在任何變量上調用成員函數和屬性。
在本文中,將會講解經常被使用的類型:Numbers
,Characters
,Booleans
,Arrays
,Strings
。
Numbers(數值)
Kotlin處理數值的方式與Java類似,單又不完全相同,例如,數值沒有隱式擴展轉換,在默寫情況下文字也略有不同。
Kotlin 提供了如下內建數值類型(與Java類似)
Type | Bit width(字寬) |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
注意:字符不是kotlin中的數值類型
字面常量(Literal Constants)
對于整數值,有以下幾種常量
- 整型:
123
- 長整型要加
L
:123L
- 長整型要加
- 16進制:
0x0F
- 二進制:
0b00001011
對于浮點數值
- Doubles類型:
123.5
,123.5e10
- Floats類型要加
f
orF
:123.5f
注意:不支持8進制
數值中的下劃線(1.1版開始)
Java8支持數值使用下劃線類分割數字分組,可以使用下劃線使數字常量更易讀:
val oneMillion = 1_000_000
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
等同于
1000000
ffecde5e
11010010011010011001010010010010
表示法(Representation)
在Java平臺上,數值被 JVM 虛擬機以字節碼的方式物理存儲的,除非我們需要做可空標識(比如說 Int?) 或者涉及泛型。
val a: Int = 10000
print(a === a) // 打印'true' ,與Java的‘===’一樣
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'
顯式轉換(Explicit Conversions)
由于不同的表示,短類型不是長類型的子類型
//這是些偽代碼,不能編譯的
val a: Int? =1 // Int (java.lang.Integer)
val b: Long? = a // Long (java.lang.Long)
print( a == b ) // 打印 'false' ,由于 Long 類型的 equals() 只有和 Long 比較才會相同
短類型是不會隱式(自動)轉換為長類型的,需要顯示(手動)轉換才行
val b: Byte = 1 //
val i: Int = b // 錯誤,不能自動轉換
改為顯示(手動)轉換
val i: Int = b.toInt() // 成功
數值類型支持的轉換有下面幾種
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
Kotlin會自動轉換類型的,比如
val l = 1.toLong + 1 // Long + Int => Long,自動轉換成Long類型
運算符(Operations)
Kotlin支持標準的算術運算表達式,這些運算符被聲明為相應類的成員。
對于位操作,沒有特殊的字符,只是命名的函數可以以中綴形式調用,例如
val x = (1 shl 2) and 0x000FF000
支持的位運算操作符有(僅適用于Int
和Long
類型)
-
shl(bits)
– 帶符號左移 (相當于 Java的<<
) -
shr(bits)
– 帶符號右移 (相當于 Java的>>
) -
ushr(bits)
– 無符號右移 (相當于 Java的>>>
) -
and(bits)
– 按位與 -
or(bits)
– 按位或 -
xor(bits)
– 按位異或 -
inv()
– 按位翻轉
Characters(字符)
字符類型用 Char 表示,不能直接當做數值來使用
fun check(c: Char) {
if (c == 1) { // 錯誤:類型不匹配
// ...
}
}
字符文字用單引號括起來:'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() // 顯示轉換為數值類型
}
Boleans(布爾值)
Kotlin的Boolean
同Java的boolean
類型一樣,只有true
和false
Boolean
的操作同Java一樣
-
||
– 或者 -
&&
– 并且 -
!
- 非
Arrays(數組)
Kotlin中的數組由Array表示,通過[]
調用get
和set
方法,支持size
屬性,以及其他,下面是Array
代碼
class Array<T> private constructor() {
val size: Int
fun get(index: Int): T
fun set(index: Int, value: T): Unit
fun iterator(): Iterator<T>
// ...
}
可以使用 arrayOf()
創建Array,arrayOf(1, 2, 3)
創建了一個[1, 2, 3]
的數組。
可以使用 arrayOfNulls()
創建一個指定大小的空Array。
另外也可以使用工廠函數,該函數采用數組大小??和函數,該函數可以返回每個數組元素的索引的初始值
// 創建 Array<String> 內容為 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
注意:和 java 不一樣,arrays 在 kotlin 中是不可變的。這意味這 kotlin 不允許我們把 Array<String>轉為 Array<Any>,這樣就阻止了可能的運行時錯誤(但可以用 Array<outAny>)
Kotlin 有專門的類來表示原始類型: ByteArray, ShortArray, IntArray 等等。這些類與Array類沒有繼承關系,但它們具有相同的方法和屬性集。也有相應的工廠功能
val x: IntArray = intArrayOf(1, 2, 3) // 創建一個Int類型的Array
x[0] = x[1] + x[2]
Strings(字符串)
字符串由類型String
表示,字符串是不可變的。字符串的元素是可以通過索引操作訪問的字符:s [i]
。一個字符串可以用一個for循環迭代
for (c in str) {
println(c)
}
字符串字面量(String Literals)
Kotlin 有兩種類型的 String
:一種是可以帶分割符的,一種是可以包含新行以及任意文本的。
帶分割符的 String
與Java 的 String
類似
val s = "Hello World!\n"
如果String 是由三個引號包裹的("""),不可以包含分割符但可以包含其它字符:
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()
默認為|
用作邊距前綴,可以選擇另一個字符并將其作為參數傳遞,如trimMargin(“>”)
。
字符串模版(String Templates)
字符串可以包含模板表達式,前面介紹了可以使用'${}'模版表達式
val s = "abc"
val str = "$s.length is ${s.length}" //識別為 "abc.length is 3"
還有一種是可以使用$
模版表達式
val i = 10
val s = "i = $i" // 識別為 "i = 10"
模版表達式同樣可以用于由三個引號包裹的String,如下面的,${"$"}
表示$符號
val price = """
${'$'}9.99
"""