與Java相似,Kotlin也提供了4種整型。html
當程序直接給出一個較大的整數時,該整數默承認能就是Long型,若是將這個整數賦值給Int、Short或Byte型,編譯器將會報錯。android
例如以下代碼。編程
程序清單:codes\02\2.3\IntVarTest.kt安全
fun main(args: Array<String>) {app
// 下面代碼是正確的ide
var a:Int = 56post
// 下面代碼須要隱式地將2999999999轉換爲Int型使用,所以編譯器將會報錯spa
var bigValue : Int = 2999999999code
// 下面代碼是正確的orm
var bigValue2: Long = 2999999999
println(bigValue)
println(bigValue2)
println(Short.MIN_VALUE)
println(Short.MAX_VALUE)
}
上面程序中粗體字代碼將2999999999做爲Int型變量的初始值,但2999999999的值處於Long的取值範圍內,所以2999999999將被當成Long型使用。故而上面這條粗體字代碼報錯。
提示:通常來講,開發者應該儘可能使用Int型就足夠了,這樣能夠提升代碼的一致性和可複用性。
因爲Int型是Kotlin最經常使用的整數類型,所以,若是聲明一個常量或變量時沒有指定數據類型,只是簡單地指定了其初始值爲整數值,那麼Kotlin會自動判斷該變量的類型爲Int。
Kotlin的整型與Java的整型不一樣,Kotlin的整型不是基本類型,而是引用類型(大體至關於Java的包裝類),Byte、Short、Int、Long都繼承了Number類型,所以這些Byte、Short、Int、Long均可調用方法、訪問屬性。
程序可經過訪問不一樣整數類型的MIN_VALUE和MAX_VALUE屬性來獲取對應類型的最大值和最小值。例如以下代碼(程序清單同上):
println(Short.MIN_VALUE)
println(Short.MAX_VALUE)
有一點須要提早說明的是:Kotlin是null安全的語言,所以Byte、Short、Int、Long型變量都能不接受null值,若是要存儲null值,應該使用Byte?、Short?、Int?、Long?類型。例如以下代碼(程序清單同上):
// Int型變量不支持null值,因此下面代碼是錯誤的
var notNull: Int = null
// Int?至關於支持null值的Int型,因此下面代碼是正確的
var nullable: Int? = null
因而可知,Kotlin語言容許在已有數據類型後添加?,添加?後的數據類型至關於對原有類型進行了擴展,帶?的數據類型可支持被賦值null值。
此外,整型類型添加?後綴與不加後綴還有一個區別:普通類型的整型變量,將會映射成Java的基本類型;帶?後綴的的整型變量,將會映射成基本類型的包裝類。舉例來講,Kotlin程序中Int類型的變量將會映射成Java的int基本類型,但Int?類型的變量則會自動映射成Java的Integer類型。例如以下代碼(程序清單同上):
var pm1: Int = 200; // pm1的類型是Java的int類型
var pm2: Int = 200; // pm2的類型是Java的int類型
println(pm1 === pm2); // 基本類型比較,輸出true
var ob1: Int? = 200; // ob1的類型是Java的Integer類型
var ob2: Int? = 200; // ob2的類型是Java的Integer類型
println(ob1 === ob2); // 引用類型比較,輸出false
上面代碼中因爲pm一、pm2兩個變量都映射成Java的基本類型,所以即便用===比較相等(該元算賦要求兩個變量引用同一個對象)也返回true;但ob一、ob2兩個變量都映射成Java的Integer對象,此時用ob1和ob2再也不引用同一個對象,所以它們用===比較返回false。
注意:若是將ob一、ob2的值改成小於-128~127之間的整數,上面ob1和ob2用===比較依然是相等的,這是因爲Java的Integer類的特徵決定,關於這一點可參考《瘋狂Java講義》6.2節。
Kotlin的整數數值有3種表示方式。
注意:Kotlin不支持八進制整數。
下面代碼片斷分別使用了二進制、十六進制的數。
程序清單:codes\02\2.3\HexTest.kt
fun main(args: Array<String>) {
// 以0b或0B開頭的整數數值是二進制的整數
var binValue1 = 0b1010101
var binValue2 = 0B10101110
// 以0x或0X開頭的整數數值是十六進制的整數
var hexValue1 = 0x13
var hexValue2 = 0XaF
println("binValue1的值爲:${binValue1}")
println("binValue2的值爲:${binValue2}")
println("hexValue1的值爲:${hexValue1}")
println("hexValue2的值爲:${hexValue2}")
}
上面代碼中用到了字符串模板:也就是在字符串中嵌入${}的形式,該${}內可放入變量或表達式,Kotlin會將該變量或表達式的值「嵌入」該字符串內。
爲了提升數值(包括浮點型)的可讀性,Kotlin容許爲數值(包括浮點型)增長下畫線做爲分隔符,也能夠在數值前添加額外的零。這些下畫線和零並不會影響數值自己。例如以下代碼(程序清單同上):
val oneMillion = 1_000_000
val price = 234_234_234 // price實際的值爲234234234
val android = 1234_1234 // android實際的值爲12341234