Kotlin基本數(shù)值類型
Kotlin 的基本數(shù)值類型有六種,即Byte,Short,Int,Long,Float,Double.我們發(fā)現(xiàn)與Java不同,它沒(méi)有char類型(kotlin中字符不是數(shù)值類型)。
| ????類型???? | ??????位寬度(Bit)??? |
|---|---|
| Byte | 8 |
| Short | 16 |
| Int | 32 |
| Long | 64 |
| Float | 32 |
| Double | 64 |
字面常量
- 十進(jìn)制,與普通寫(xiě)法一般,如 1234
- Long型,在數(shù)字后面加L.==L必須大寫(xiě)==。如 1234L
- 十六進(jìn)制,以0x開(kāi)頭。 如0xffffff
- 二進(jìn)制表示則以0b打頭,如 0b00001011
- 浮點(diǎn)數(shù)值若以f或F結(jié)束,則為Float類型,否則為Double
- 不支持八進(jìn)制的字面常量。
- 定義數(shù)字常量時(shí),可以使用 ==_==(下劃線)分隔數(shù)字,讓其更易讀
定義常量變量
-
Kotlin中定義常量與不可變變量(類似于Java final關(guān)鍵字修飾的變量)使用val關(guān)鍵字
val <標(biāo)識(shí)符> : <類型> = <初始化值> -
變量定義則使用關(guān)鍵字 var
var <標(biāo)識(shí)符> : <類型> = <初始化值>
編繹器支持自動(dòng)類型判斷,即聲明時(shí)可以不指定類型,由編繹器去判定。
非抽象類中,全局常量或變量在聲明變量時(shí)必須初始化。否則會(huì)有如下提示
或者改成這樣就不會(huì)有問(wèn)題
abstract class Test {
abstract val q :Int;
}
而方法內(nèi)的局部變量或常量,在聲明時(shí)則可以不初始化,但是在引用前必須初始化,如下:
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類型表示,它有兩個(gè)值:true 和 false。
Boolean內(nèi)置的函數(shù)邏輯運(yùn)算有:
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 不能直接和數(shù)字操作,Char 必需是單引號(hào)''包含起來(lái)的。比如普通字符 '0','a'。
如下的錯(cuò)誤示例
var Char ch = 1;//error
字符字面值需用單引號(hào)括起來(lái),如 ‘1’。
特殊字符需用反斜杠轉(zhuǎn)義。支持這幾個(gè)轉(zhuǎn)義序列:\t、 \b、\n、\r、'、"、\ 和 $。 編碼其他字符要用 Unicode 轉(zhuǎn)義序列語(yǔ)法:'\uFF00'。
-
可以使用toInt()將數(shù)字字符轉(zhuǎn)化為數(shù)字
fun testMethod3(){ val ch :Char = '8'; val a :Int = ch.toInt() print(a) }
數(shù)組
數(shù)組用類 Array 實(shí)現(xiàn),并且還有一個(gè) size 屬性及 get 和 set 方法,由于使用 [] 重載了 get 和 set 方法,所以我們可以通過(guò)下標(biāo)很方便的獲取或者設(shè)置數(shù)組對(duì)應(yīng)位置的值。
數(shù)組的創(chuàng)建兩種方式:
- 使用函數(shù)arrayOf();
- 使用工廠函數(shù)。
如下所示
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)
第一個(gè)參數(shù),表示數(shù)組長(zhǎng)度,后面的花括號(hào)中是一個(gè)初始化值的執(zhí)行代碼塊,給出數(shù)組下標(biāo),初始化該下標(biāo)的值。
除了類Array,還有ByteArray, ShortArray, IntArray,用來(lái)表示各個(gè)類型的數(shù)組,省去了裝箱操作,因此效率更高,其用法同Array一樣:
val x: IntArray = intArrayOf(1, 2, 3)
注: 與 Java 不同的是,Kotlin 中數(shù)組是不型變的(invariant)。這意味著 Kotlin 不讓我們把 Array 賦值給 Array,以防止可能的運(yùn)行時(shí)失敗
字符串類型
字符串也可以理解成字符的數(shù)組,可以用[]通過(guò)下標(biāo)來(lái)獲取對(duì)應(yīng)的字符
Kotlin 支持三個(gè)引號(hào) """ 擴(kuò)起來(lái)的字符串,支持多行字符串,比如:
fun strSample() {
val text = """
str1
str2
"""
println(text) // 輸出有一些前置空格
}
String 可以通過(guò) trimMargin() 方法來(lái)刪除多余的空白。
fun strSample() {
val text = """
| str1
|str2
|多行字符串
|bbbbbb
""".trimMargin()
println(text) // 前置空格刪除了
}
字符串模板
$ 表示一個(gè)變量名或者變量值
$varName 表示變量值
-
${varName.fun()} 表示變量的方法返回值:
fun transform(text:String):String ="${text.replace("is","not is")},but origin is $text"
原生字符串和轉(zhuǎn)義字符串內(nèi)部都支持模板。 如果你需要在原生字符串中表示字面值 $ 字符(它不支持反斜杠轉(zhuǎn)義),你可以用下列語(yǔ)法:
fun strMouduar() {
val price = """
${'$'}9.99
"""
println(price) // 求值結(jié)果為 $9.99
}
類型對(duì)象比較
Java中比較兩個(gè)對(duì)象地址是否相同時(shí),用==符號(hào),若要比較值相等,則調(diào)用Object的equals方法,但是在Kotlin中,==即表示比較值(equals),===則相當(dāng)于比較對(duì)象地址
fun compare(args: Array<String>) {
val a: Int = 10000
println(a === a) // true,值相等,對(duì)象地址相等
//經(jīng)過(guò)了裝箱,創(chuàng)建了兩個(gè)不同的對(duì)象
val b: Int? = a
val c: Int? = a
//雖然經(jīng)過(guò)了裝箱,但是值是相等的,都是10000
println(b === c) // false,值相等,對(duì)象地址不一樣
println(b == c) // true,值相等
}
數(shù)據(jù)類型轉(zhuǎn)換
由于不同的表示方式,較小類型并不是較大類型的子類型,較小的類型不能隱式轉(zhuǎn)換為較大的類型。 這意味著在不進(jìn)行顯式轉(zhuǎn)換的情況下我們不能把 Byte 型值賦給一個(gè) Int 變量。
val b: Byte = 1 // OK, 字面值是靜態(tài)檢測(cè)的
val i: Int = b // 錯(cuò)誤
可以像下面這樣
val b: Byte = 1 // OK, 字面值是靜態(tài)檢測(cè)的
val i: Int = b.toInt() // OK
每種數(shù)據(jù)類型都有下面的這些方法,可以轉(zhuǎn)化為其它的類型:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
根據(jù)上下文環(huán)境能推斷出正確的數(shù)據(jù)類型,這種情況下類型能自動(dòng)轉(zhuǎn)化。
val l = 1L + 3 // Long + Int => Long
位操作符
對(duì)于Int和Long類型,還有一系列的位操作符可以使用,分別是:
shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 無(wú)符號(hào)右移位 (Java’s >>>)
and(bits) – 與
or(bits) – 或
xor(bits) – 異或
inv() – 反向