Kotlin基本數值類型
Kotlin 的基本數值類型有六種掖鱼,即Byte,Short,Int,Long,Float,Double.我們發(fā)現(xiàn)與Java不同止剖,它沒有char類型(kotlin中字符不是數值類型)媳溺。
????類型???? | ??????位寬度(Bit)??? |
---|---|
Byte | 8 |
Short | 16 |
Int | 32 |
Long | 64 |
Float | 32 |
Double | 64 |
字面常量
- 十進制,與普通寫法一般夜郁,如 1234
- Long型,在數字后面加L.==L必須大寫==脖咐。如 1234L
- 十六進制,以0x開頭汇歹。 如0xffffff
- 二進制表示則以0b打頭屁擅,如 0b00001011
- 浮點數值若以f或F結束,則為Float類型产弹,否則為Double
- 不支持八進制的字面常量派歌。
- 定義數字常量時,可以使用 ==_==(下劃線)分隔數字痰哨,讓其更易讀
定義常量變量
-
Kotlin中定義常量與不可變變量(類似于Java final關鍵字修飾的變量)使用val關鍵字
val <標識符> : <類型> = <初始化值>
-
變量定義則使用關鍵字 var
var <標識符> : <類型> = <初始化值>
編繹器支持自動類型判斷胶果,即聲明時可以不指定類型,由編繹器去判定斤斧。
非抽象類中早抠,全局常量或變量在聲明變量時必須初始化。否則會有如下提示
或者改成這樣就不會有問題
abstract class Test {
abstract val q :Int;
}
而方法內的局部變量或常量撬讽,在聲明時則可以不初始化蕊连,但是在引用前必須初始化,如下:
fun testMethod():Int{
var a :Int;
a = 2;
a++;
return a+2;
}
下面有一些聲明常量或變量的例子
abstract val q :Int;
val a :Int = 1;
val b = 1;
val temp = 4L;
var bu = 2.55;
val PRICE = 1234_5214_1522;
var t = 0xffffff;
var f = 4.5f;
var c:String = "my name is oeager"
布爾類型
布爾用Boolean類型表示游昼,它有兩個值:true 和 false甘苍。
Boolean內置的函數邏輯運算有:
fun booleanTypeTest(flag:Boolean,a:Boolean){
val and = flag.and(a);//&&
val or = flag.or(a);// ||
var not = flag.not();// !
var xor = flag.or(a)// ^
}
字符類型
和 Java 不一樣,Kotlin 中的 Char 不能直接和數字操作烘豌,Char 必需是單引號''包含起來的载庭。比如普通字符 '0','a'廊佩。
如下的錯誤示例
var Char ch = 1;//error
字符字面值需用單引號括起來,如 ‘1’标锄。
特殊字符需用反斜杠轉義顽铸。支持這幾個轉義序列:\t、 \b跋破、\n毒返、\r拧簸、'盆赤、"牺六、\ 和 $颤枪。 編碼其他字符要用 Unicode 轉義序列語法:'\uFF00'。
-
可以使用toInt()將數字字符轉化為數字
fun testMethod3(){ val ch :Char = '8'; val a :Int = ch.toInt() print(a) }
數組
數組用類 Array 實現(xiàn)淑际,并且還有一個 size 屬性及 get 和 set 方法畏纲,由于使用 [] 重載了 get 和 set 方法,所以我們可以通過下標很方便的獲取或者設置數組對應位置的值春缕。
數組的創(chuàng)建兩種方式:
- 使用函數arrayOf()盗胀;
- 使用工廠函數。
如下所示
fun arrayTest(args:Array<String>){
val array1 = arrayOf("str","str2")
val array2 = Array(5,{index->(index+1)});
print(array1[0])//輸出 str
print(array2[1])//輸出2
}
注 工廠方法源碼如下
/**
* Creates a new array with the specified [size], where each element is calculated by calling the specified
* [init] function. The [init] function returns an array element given its index.
*/
public inline constructor(size: Int, init: (Int) -> T)
第一個參數锄贼,表示數組長度票灰,后面的花括號中是一個初始化值的執(zhí)行代碼塊,給出數組下標宅荤,初始化該下標的值屑迂。
除了類Array,還有ByteArray, ShortArray, IntArray膘侮,用來表示各個類型的數組屈糊,省去了裝箱操作,因此效率更高琼了,其用法同Array一樣:
val x: IntArray = intArrayOf(1, 2, 3)
注: 與 Java 不同的是,Kotlin 中數組是不型變的(invariant)夫晌。這意味著 Kotlin 不讓我們把 Array 賦值給 Array雕薪,以防止可能的運行時失敗
字符串類型
字符串也可以理解成字符的數組,可以用[]通過下標來獲取對應的字符
Kotlin 支持三個引號 """ 擴起來的字符串晓淀,支持多行字符串所袁,比如:
fun strSample() {
val text = """
str1
str2
"""
println(text) // 輸出有一些前置空格
}
String 可以通過 trimMargin() 方法來刪除多余的空白。
fun strSample() {
val text = """
| str1
|str2
|多行字符串
|bbbbbb
""".trimMargin()
println(text) // 前置空格刪除了
}
字符串模板
$ 表示一個變量名或者變量值
$varName 表示變量值
-
${varName.fun()} 表示變量的方法返回值:
fun transform(text:String):String ="${text.replace("is","not is")},but origin is $text"
原生字符串和轉義字符串內部都支持模板凶掰。 如果你需要在原生字符串中表示字面值 $ 字符(它不支持反斜杠轉義)燥爷,你可以用下列語法:
fun strMouduar() {
val price = """
${'$'}9.99
"""
println(price) // 求值結果為 $9.99
}
類型對象比較
Java中比較兩個對象地址是否相同時,用==符號懦窘,若要比較值相等前翎,則調用Object的equals方法,但是在Kotlin中畅涂,==即表示比較值(equals),===則相當于比較對象地址
fun compare(args: Array<String>) {
val a: Int = 10000
println(a === a) // true港华,值相等,對象地址相等
//經過了裝箱午衰,創(chuàng)建了兩個不同的對象
val b: Int? = a
val c: Int? = a
//雖然經過了裝箱立宜,但是值是相等的冒萄,都是10000
println(b === c) // false,值相等橙数,對象地址不一樣
println(b == c) // true尊流,值相等
}
數據類型轉換
由于不同的表示方式,較小類型并不是較大類型的子類型灯帮,較小的類型不能隱式轉換為較大的類型崖技。 這意味著在不進行顯式轉換的情況下我們不能把 Byte 型值賦給一個 Int 變量。
val b: Byte = 1 // OK, 字面值是靜態(tài)檢測的
val i: Int = b // 錯誤
可以像下面這樣
val b: Byte = 1 // OK, 字面值是靜態(tài)檢測的
val i: Int = b.toInt() // OK
每種數據類型都有下面的這些方法施流,可以轉化為其它的類型:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
根據上下文環(huán)境能推斷出正確的數據類型响疚,這種情況下類型能自動轉化。
val l = 1L + 3 // Long + Int => Long
位操作符
對于Int和Long類型瞪醋,還有一系列的位操作符可以使用忿晕,分別是:
shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 無符號右移位 (Java’s >>>)
and(bits) – 與
or(bits) – 或
xor(bits) – 異或
inv() – 反向