基本類型
在 Kotlin 中爷抓,所有東西都是對象卡者,在這個意義上講我們可以在任何變量上調(diào)用成員函數(shù)和屬性盆赤。 一些類型可以有特殊的內(nèi)部表示——例如贾富,數(shù)字、字符和布爾值可以在運行時表示為原生類型值牺六,但是對于用戶來說颤枪,它們看起來就像普通的類。 在本節(jié)中淑际,我們會描述 Kotlin 中使用的基本類型:數(shù)字畏纲、字符、布爾值春缕、數(shù)組與字符串盗胀。
數(shù)字
Kotlin 處理數(shù)字在某種程度上接近 Java,但是并不完全相同锄贼。例如票灰,對于數(shù)字沒有隱式拓寬轉換(如 Java 中 int 可以隱式轉換為long——譯者注),另外有些情況的字面值略有不同宅荤。
Kotlin 提供了如下的內(nèi)置類型來表示數(shù)字(與 Java 很相近):
Type | Bit width |
---|---|
Double | 64 |
Long | 64 |
Float | 32 |
Int | 32 |
Short | 16 |
Byte | 8 |
字面常量
數(shù)值常量字面值有以下幾種:
- 十進制: 123
- Long 類型用大寫 L 標記: 123L
- 十六進制: 0x0F
- 二進制: 0b00001011
注意: 不支持八進制
Kotlin 同樣支持浮點數(shù)的常規(guī)表示方法:
- 默認 double:
123.5
屑迂、123.5e10
- Float 用
f
或者F
標記:123.5f
數(shù)字字面值中的下劃線(自 1.1 起)
你可以使用下劃線使數(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
運算
Kotlin中的運算符被定義成相應類的類成員函數(shù),通過復寫相應運算符函數(shù)冯键,可重載運算符功能惹盼。參見 運算符重載。
對于位運算惫确,沒有特殊字符來表示手报,而只可用中綴方式調(diào)用命名函數(shù),例如:
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()
– 位非
字符
字符用 Char
類型表示改化。它們不能直接當作數(shù)字
字符字面值用單引號括起來:'1'
掩蛤。 特殊字符可以用反斜杠轉義。
我們可以顯式把字符轉換為 Int 數(shù)字:
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // 顯式轉換為數(shù)字
}
布爾
布爾用 Boolean
類型表示所袁,它有兩個值:true
和 false
盏档。
若需要可空引用布爾會被裝箱。
內(nèi)置的布爾運算有:
-
||
– 或 -
&&
– 與 -
!
– 非
數(shù)組
數(shù)組在 Kotlin 中使用 Array
類來表示燥爷,它定義了 get 和 set 函數(shù)(按照運算符重載約定這會轉變?yōu)?[])和 size 屬性蜈亩,以及一些其他有用的成員函數(shù):
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>
// ……
}
Kotlin數(shù)組創(chuàng)建方法:
//創(chuàng)建數(shù)組懦窘,并賦值為1,2稚配,3
val arrInt: Array<Int> = arrayOf(1, 2, 3)
//創(chuàng)建數(shù)組畅涂,長度為5,內(nèi)容為空
val arrStringNulls: Array<String?> = arrayOfNulls<String>(5)
for (index in 0 until arrStringNulls.size) {
arrStringNulls[index] = "This is " + index
}
for (index in arrStringNulls.indices)
println("arrStringNulls[$index] = ${arrStringNulls[index]}")
//創(chuàng)建數(shù)組道川,長度為5午衰,使用一個函數(shù)參數(shù)的工廠函數(shù)生產(chǎn)元素
val arrStringByFactroy: Array<String> = Array<String>(5, { i -> (i * i).toString() })
for (value in arrStringByFactroy)
println("value=$value")
Kotlin 也有無裝箱開銷的專門的類來表示原生類型數(shù)組: ByteArray
、 ShortArray
冒萄、IntArray
等等臊岸。這些類和 Array
并沒有繼承關系,但是它們有同樣的方法屬性集尊流。它們也都有相應的工廠方法:
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
字符串
字符串用 String
類型表示帅戒。字符串是不可變的。 字符串的元素——字符可以使用索引運算符訪問: s[i]
崖技。 可以用 for
循環(huán)迭代字符串:
for (c in str) {
println(c)
}
字符串字面值
Kotlin 有兩種類型的字符串字面值: 轉義字符串逻住,原生字符串。
- 轉義字符串:可以有轉義字符迎献,轉義字符串很像 Java 字符串:
val s = "Hello, world!\n"
- 原生字符串:使用三個引號(""")分界符括起來瞎访,內(nèi)部沒有轉義并且可以包含換行和任何其他字符:
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
通過 trimMargin() 函數(shù)去除前導空格,默認 |
用作邊界前綴吁恍,但你可以選擇其他字符并作為參數(shù)傳入扒秸,比如 trimMargin(">")
。
val text = """
>Tell me and I forget.
>Teach me and I remember.
>Involve me and I learn.
>(Benjamin Franklin)
""".trimMargin(">")
變量
Kotlin的變量分為可變和不可變變量践盼,和Java中是否采用final修飾的變量含義一樣鸦采。
- 采用
val
聲明的變量為不可變變量,即常量:
//編譯期常量
const val tag: String = "MainActivity"
//常量
val tag: String = getString()
//等同于Java
final String tag = "MainActivity";
- 采用
var
聲明的變量為可變變量:
var num: Int = 1
//等同于Java
int num = 1;
函數(shù)
Kotlin定義一個函數(shù)的格式如下:
訪問控制符 fun 方法名(參數(shù)咕幻,參數(shù)渔伯,參數(shù)) : 返回值類型 {
···
···
}
- 訪問控制符:Kotlin的訪問控制符范圍從大到小分別為:
public
、internal
肄程、protected
锣吼、private
,不聲明默認為public
蓝厌;
Kotlin與Java函數(shù)的一個重大的區(qū)別就是:
Kotlin支持包級函數(shù)玄叠,即函數(shù)不依賴于類而存在,而在Java中拓提,函數(shù)必須聲明在類里面:
//包級函數(shù)
fun main(args: Array<String>){
}
//Java函數(shù)必須依賴類而存在
public class ClzFun{
public static void main(String[] args){
}
}
可變參數(shù)
Kotlin中读恃,可變參數(shù)使用關鍵字 vararg
:
fun variousArgs(vararg args: String) {
for (arg: String in args)
println(arg)
}
//Java可變參數(shù)
public void variousArgs(String... args){
}
靜態(tài)變量和靜態(tài)函數(shù)
Kotlin中并沒有像Java一樣,提供 static
這個關鍵字,如果想在Kotlin中實現(xiàn)靜態(tài)變量和靜態(tài)函數(shù)寺惫,可以使用 companion object, companion object
后可以加上自定義的object名疹吃,也可以省略。
fun main(args: Array<String>) {
println(KotlinStatic.staticInt)
KotlinStatic.getInstance()
}
class KotlinStatic{
companion object StaticTest{
var staticInt: Int = 1
fun getInstance() : KotlinStatic{
return KotlinStatic()
}
}
}
//Java靜態(tài)常量和靜態(tài)函數(shù)
public class JavaStatic{
public static int staticInt = 1;
public static JavaStatic getInstance(){
return new JavaStatic();
}
}
對于在Kotlin中實現(xiàn)static變量和static方法西雀,官方更推薦直接使用包級別的變量或函數(shù)來實現(xiàn)萨驶。因為如果使用 companion object
實現(xiàn) static
功能,Kotlin在運行的時候艇肴,是會創(chuàng)建一個 companion object
實例對象腔呜,就相當于多了一些時間進行對象創(chuàng)建,初始化分配空間等操作再悼。
附錄
注意事項:
- Kotlin對于數(shù)字沒有隱式拓寬轉換(如 Java 中 int 可以隱式轉換為long)
所以核畴,對于下面這個例子,其是無法通過編譯的:
val b: Byte = 1 // OK, 字面值是靜態(tài)檢測的
val i: Int = b // 錯誤
Kotlin沒有辦法將 Byte
賦值給 Int
類型帮哈,對于這種不同類型數(shù)值賦值膛檀,我們必須通過 顯示轉型 來拓寬數(shù)字:
val i: Int = b.toInt() // OK: 顯式拓寬
每種數(shù)字類型支持如下的轉換:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
運算符重載示例:
data class Counter(val x: Int) {
operator fun plus(inc: Int) = Counter(x + inc)
operator fun plus(inc: Counter): Counter {
return Counter(x + inc.x)
}
}
fun main(args: Array<String>) {
println(Counter(1) + Counter(3))
println(Counter(1) + 11)
}
本文大部分內(nèi)容來自:https://hltj.gitbooks.io/kotlin-reference-chinese/content/txt/basic-types.html