kotlin學習筆記(四)

基本類型

在 Kotlin 中,所有變量的成員方法和屬性都是一個對象。一些類型是內建的,它們的實現是優化過的,但對用戶來說它們就像普通的類一樣。在這節中,我們將會講到大多數的類型:數值,字符,布爾,以及數組。

數值

Kotlin 處理數值的方法和 java 很相似,但不是完全一樣。比如,不存在隱式轉換數值的精度,并且在字面上有一些小小的不同。

Kotlin 提供了如下內建數值類型(和 java 很相似):

類型位寬

Double64

Float32

Long64

Int32

Short16

Byte8

注意字符在 Kotlin 中不是數值類型

字面值常量

主要是以下幾種字面值常量:

--十進制數值:123

--長整型要加大寫L:123L

--16進制:0x0f

--二進制:0b00001011

注意不支持8進制

Kotlin 也支持傳統的浮點數表示:

-- 默認雙精度浮點數(Double) :123.5,123.5e10

-- 單精度浮點數(Float)要添加f或F:123.5f

數值常量中可以添加下劃線分割(1.1版本新特性)

您可以使用下劃線增加數值常量的可讀性:

valoneMillion=1_000_000valcreditCardNumber=1234_5678_9012_3456LvalsocialSecurityNumber=999_99_9999LvalhexBytes=0xFF_EC_DE_5Evalbytes=0b11010010_01101001_10010100_10010010

表示

在 java 平臺上,數值被 JVM 虛擬機以字節碼的方式物理存儲的,除非我們需要做可空標識(比如說 Int?) 或者涉及泛型。在后者中數值是被裝箱的。

注意裝箱過的數值是不保留特征的:

vala:Int=10000print (a===a )//打印 'true'valboxedA:Int?=avalanotherBoxedA:Int?=aprint (boxedA===anotherBoxedA )//注意這里打印的是 'false'

另一方面,它們是值相等的:

vala:Int=10000print(a==a)//打印 'true'valboxedA:Int?=avalanotherBoxedA:Int?=aprint(boxedA==anotherBoxedA)//打印 'true'

顯式轉換

由于不同的表示,短類型不是長類型的子類型。如果是的話我們就會碰到下面這樣的麻煩了

//這是些偽代碼,不能編譯的vala:Int?=1//一個裝箱過的 Int (java.lang.Integer)valb:Long?=a//一個隱式裝箱的 Long (java.lang.Long)print( a==b )//很驚訝吧 這次打印出的是 'false' 這是由于 Long 類型的 equals() 只有和 Long 比較才會相同

因此不止是恒等,有時候連等于都會悄悄丟失。

所以,短類型是不會隱式轉換為長類型的。這意味著我們必須顯式轉換才能把Byte賦值給Int

valb:Byte=1//OK, 字面值常量會被靜態檢查vali:Int=b//ERROR

我們可以通過顯式轉換把數值類型提升

vali:Int=b.toInt()//顯式轉換

每個數值類型都支持下面的轉換:

toByte(): Byte

toShort(): Short

toInt(): Int

toLong(): Long

toFloat(): Float

toDouble(): Double

toChar(): Char

隱式轉換一般情況下是不容易被發覺的,因為我們使用了上下文推斷出類型,并且算術運算會為合適的轉換進行重載,比如

vall=1.toLong+1//Long? + Int => Long

運算符

Kotlin支持標準的算術運算表達式,這些運算符被聲明為相應類的成員(但是編譯器將調用優化到相應的指令)。參看運算符重載

至于位運算,Kotlin 并沒有提供特殊的操作符,只是提供了可以叫中綴形式的方法,比如:

valx=(1shl2) and0x000FF000

下面是全部的位運算操作符(只可以用在Int和Long類型):

shl(bits)– 有符號左移 (相當于 Java’s<<)shr(bits)– 有符號右移 (相當于 Java’s>>)ushr(bits)– 無符號右移 (相當于 Java’s>>>)and(bits)– 按位與or(bits)– 按位或xor(bits)– 按位異或inv(bits)– 按位翻轉

字符

字符類型用Char表示。不能直接當做數值來使用

funcheck(c:Char) {if(c==1) {//ERROR: 類型不匹配//...}}

字符是由單引號包裹的'1',特殊的字符通過反斜杠\轉義,下面的字符序列支持轉義:\t,\b,\n,\r,\',\",\\和\$。編碼任何其他字符,使用 Unicode 轉義語法:\uFF00。

我們可以將字符顯示的轉義為Int數字:

fundecimalDigitValue(c:Char):Int{if(c!in'0'..'9')throwIllegalArgumentException("Out of range")returnc.toInt()-'0'.toInt()//顯示轉換為數值類型}

和數值類型一樣,需要一個可空引用時,字符會被裝箱。特性不會被裝箱保留。

布爾值

布爾值只有 true 或者 false

如果需要一個可空引用,則可以將布爾值裝箱

布爾值的內建操作包括

||– 短路或

&&– 短路與

!- 取反

數組

數組在 Kotlin 中由Array類表示,有get和set方法(通過運算符重載可以由[]調用),以及size方法,以及一些常用的函數:

classArray private constructor() {valsize:Intoperatorfunget(index:Int):Toperatorfunset(index:Int,value:T):Unitoperatorfuniterator():Iterator//...}

我們可以給庫函數arrayOf()傳遞每一項的值來創建Array,arrayOf(1, 2, 3)創建了一個[1, 2, 3] 這樣的數組。也可以使用庫函數arrayOfNulls()創建一個指定大小的空Array。

或者通過指定Array大小并提供一個通過索引產生數組元素值的工廠函數:

//創建一個 Array? 內容為 ["0", "1", "4", "9", "16"]valasc=Array(5, {i->(i*i).toString() })

像我們上面提到的,[]操作符表示調用get()set()函數

注意:和 java 不一樣,arrays 在 kotlin 中是不可變的。這意味這 kotlin 不允許我們把Array轉為Array,這樣就阻止了可能的運行時錯誤(但你可以使用Array, 參看Type Projections)

Kotlin 有專門的類來表示原始類型從而避免過度裝箱: ByteArray, ShortArray, IntArray 等等。這些類與 Array 沒有繼承關系,但它們有一樣的方法與屬性。每個都有對應的庫函數:

valx:IntArray=intArrayOf(1,2,3)x[0]=x[1]+x[2]

字符串

字符串是由String表示的。字符串是不變的。字符串的元素可以通過索引操作讀取:s[i]。字符串可以用 for 循環迭代:

for(cinstr) {println(c)}

字符串字面量

Kotlin 有兩種類型的字符串字面量:一種是可以帶分割符的,一種是可以包含新行以及任意文本的。帶分割符的 string 很像 java 的 string:

vals="Hello World!\n"

轉義是使用傳統的反斜線的方式。參見Characters,以獲得支持的轉義序列。

整行String 是由三個引號包裹的("""),不可以包含分割符但可以包含其它字符:

valtext="""for (c in "foo")print(c)"""

你可以通過trim-margin()函數移除空格:

valtext="""|Tell me and I forget.|Teach me and I remember.|Involve me and I learn.|(Benjamin Franklin)""".trimMargin()

字符串模板

字符串可以包含模板表達式,即可求值的代碼片段,并將其結果連接到字符串中。一個模板表達式由一個 $ 開始并包含另一個簡單的名稱:

vali=10vals="i =$i"http://求值為 "i = 10"

或者是一個帶大括號的表達式:

vals="abc"valstr="$s.length is${s.length}"http://求職為 "abc.length is 3"

模板既可以原始字符串中使用,也可以在轉義字符串中使用。如果需要在原始字符串(不支持反斜杠轉義)中表示一個文字$字符,那么可以使用以下語法:

valprice="""${'$'}9.99"""

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容