Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基本類型-基礎(chǔ)語法(二)

本人也是在初學(xué)Kotlin,如有錯誤胖喳,請幫忙指出熄捍,持續(xù)更新

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基本類型-基礎(chǔ)語法(二)

在 Kotlin 中,所有變量的成員方法和屬性都是一個對象岛宦。一些類型是內(nèi)建的台丛,它們 的實(shí)現(xiàn)是優(yōu)化過的耍缴,但對用戶來說它們就像普通的類一樣。

數(shù)值挽霉,字符防嗡,布爾,以及數(shù)組侠坎。

數(shù)值

Kotlin 處理數(shù)值的方法和 java 很相似蚁趁,但不是完全一樣。比如实胸,不存在隱式轉(zhuǎn)換數(shù) 值的精度他嫡,并且在字面上有一些小小的不同番官。
Kotlin 提供了如下內(nèi)建數(shù)值類型(和 java 很相似):


在這里插入圖片描述

注意字符在 Kotlin 中不是數(shù)值類型
字面值常量
主要是以下幾種字面值常量:

  • 十進(jìn)制數(shù)值: 1234
  • 長整型要加大寫 L : 1234L
  • 16進(jìn)制: 0x0f
  • 二進(jìn)制: 0b00001011

注意不支持8進(jìn)制
Kotlin 也支持傳統(tǒng)的浮點(diǎn)數(shù)表示:

  • 默認(rèn)雙精度浮點(diǎn)數(shù)(Double) : 1234.5 , 1234.5e10
  • 單精度浮點(diǎn)數(shù)(Float)要添加 f 或 F :1234.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

在 java 平臺上,數(shù)值被 JVM 虛擬機(jī)以字節(jié)碼的方式物理存儲的钢属,除非我們需要做 可空標(biāo)識(比如說 Int?) 或者涉及泛型徘熔。在后者中數(shù)值是被裝箱的。
注意裝箱過的數(shù)值是不保留特征的:

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

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

val a: Int = 10000 
print(a == a) // 打印 'true' 
val boxedA: Int? = a 
val anotherBoxedA: Int? = a 
print(boxedA == anotherBoxedA) // 打印 'true'

顯式轉(zhuǎn)換
由于不同的表示酷师,短類型不是長類型的子類型。如果是的話我們就會碰到下面這樣 的麻煩了

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

因此不止是恒等染乌,有時候連等于都會悄悄丟失山孔。
所以,短類型是不會隱式轉(zhuǎn)換為長類型的荷憋。這意味著我們必須顯式轉(zhuǎn)換才能把 Byte 賦值給 Int

val b: Byte = 1 // OK, 字面值常量會被靜態(tài)檢查 
val i: Int = b // ERROR

以通過顯式轉(zhuǎn)換把數(shù)值類型提升

val i: Int = b.toInt() // 顯式轉(zhuǎn)換

每個數(shù)值類型都支持下面的轉(zhuǎn)換:

toByte(): Byte 
toShort(): Short 
toInt(): Int 
toLong(): Long 
toFloat(): Float 
toDouble(): Double 
toChar(): Char

隱式轉(zhuǎn)換一般情況下是不容易被發(fā)覺的台颠,因?yàn)槲覀兪褂昧松舷挛耐茢喑鲱愋停⑶?算術(shù)運(yùn)算會為合適的轉(zhuǎn)換進(jìn)行重載台谊,比如

val l = 1.toLong + 1 // Long + Int => Long
運(yùn)算符

Kotlin支持標(biāo)準(zhǔn)的算術(shù)運(yùn)算表達(dá)式蓉媳,這些運(yùn)算符被聲明為相應(yīng)類的成員(但是編譯器 將調(diào)用優(yōu)化到相應(yīng)的指令)。
至于位運(yùn)算锅铅,Kotlin 并沒有提供特殊的操作符酪呻,只是提供了可以叫中綴形式的方 法,

val x = (1 shl 2) and 0x000FF000

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

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

字符類型用 Char 表示盐须。不能直接當(dāng)做數(shù)值來使用
字符是由單引號包裹的'1'玩荠,特殊的字符通過反斜杠\轉(zhuǎn)義,下面的字符序列支持轉(zhuǎn) 義: \t , \b , \n , \r , ' , " , \ 和 $ 贼邓。編碼任何其他字符阶冈,使用 Unicode 轉(zhuǎn)義語法: \uFF00 。
將字符顯示的轉(zhuǎn)義為Int數(shù)字:

fun decimalDigitValue(c: Char): Int { 
    if (c !in '0'..'9') 
    throw IllegalArgumentException("Out of range") 
    return c.toInt() - '0'.toInt() //顯示轉(zhuǎn)換為數(shù)值類型 
}

和數(shù)值類型一樣塑径,需要一個可空引用時女坑,字符會被裝箱。特性不會被裝箱保留统舀。

布爾值

布爾值只有 true 或者 false
如果需要一個可空引用匆骗,則可以將布爾值裝箱
布爾值的內(nèi)建操作包括

  • || – 短路或
  • && – 短路與
  • ! - 取反
數(shù)組

數(shù)組在 Kotlin 中由 Array 類表示,有 get 和 set 方法(通過運(yùn)算符重載可以 由[]調(diào)用)誉简,以及 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> 
    // ... 
}

我們可以給庫函數(shù) arrayOf() 傳遞每一項(xiàng)的值來創(chuàng)建Array, arrayOf(1, 2, 3) 創(chuàng)建了一個[1, 2, 3] 這樣的數(shù)組闷串。也可以使用庫函數(shù) arrayOfNulls() 創(chuàng)建 一個指定大小的空Array瓮钥。
或者通過指定Array大小并提供一個通過索引產(chǎn)生數(shù)組元素值的工廠函數(shù):

// 創(chuàng)建一個 Array<String> 內(nèi)容為 ["0", "1", "4", "9", "16"] 
val asc = Array(5, {i -> (i * i).toString() })

[] 操作符表示調(diào)用 get() set() 函數(shù)
注意:和 java 不一樣,arrays 在 kotlin 中是不可變的。這意味 kotlin 不允許我們 把 Array.String轉(zhuǎn)為 Array.Any,這樣就阻止了可能的運(yùn)行時錯誤(但你可 以使用 Array.outAny.
Kotlin 有專門的類來表示原始類型從而避免過度裝箱: ByteArray, ShortArray, IntArray 等等碉熄。這些類與 Array 沒有繼承關(guān)系桨武,但它們有一樣的方法與屬性。每個 都有對應(yīng)的庫函數(shù):

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 有兩種類型的字符串字面量:一種是可以帶分割符的一姿,一種是可以包含新行 以及任意文本的七咧。帶分割符的 string 很像 java 的 string:

val s = "Hello World!\n"

轉(zhuǎn)義是使用傳統(tǒng)的反斜線的方式。
整行String 是由三個引號包裹的( """ ),不可以包含分割符但可以包含其它字符:

val text = """ 
    for (c in "foo") 
        print(c)
"""

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

val text = """ 
|Tell me and I forget. 
|Teach me and I remember. 
|Involve me and I learn. 
|(Benjamin Franklin) 
""".trimMargin()
字符串模板

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

val i = 10 
val s = "i = $i" // 求值為 "i = 10"

或者是一個帶大括號的表達(dá)式:

val s = "abc" 
val str = "$s.length is ${s.length}" // 求值為 "abc.length is 3"

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

val price = """ 
    ${'$'}9.99 
"""

這篇文章主要分享Kotlin的基本類型與java的區(qū)別携冤。

本人也是在初學(xué)Kotlin悼粮,如有錯誤,請幫忙指出曾棕,持續(xù)更新

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扣猫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翘地,更是在濱河造成了極大的恐慌申尤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衙耕,死亡現(xiàn)場離奇詭異昧穿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來什往,“玉大人,你說我怎么就攤上這事饰潜。” “怎么了磁奖?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵囊拜,是天一觀的道長某筐。 經(jīng)常有香客問我比搭,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任身诺,我火速辦了婚禮蜜托,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霉赡。我一直安慰自己橄务,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布穴亏。 她就那樣靜靜地躺著蜂挪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗓化。 梳的紋絲不亂的頭發(fā)上棠涮,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音刺覆,去河邊找鬼严肪。 笑死,一個胖子當(dāng)著我的面吹牛谦屑,可吹牛的內(nèi)容都是我干的驳糯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼氢橙,長吁一口氣:“原來是場噩夢啊……” “哼酝枢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悍手,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤隧枫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谓苟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體官脓,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年涝焙,在試婚紗的時候發(fā)現(xiàn)自己被綠了卑笨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡仑撞,死狀恐怖赤兴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隧哮,我是刑警寧澤桶良,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站沮翔,受9級特大地震影響陨帆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一疲牵、第九天 我趴在偏房一處隱蔽的房頂上張望承二。 院中可真熱鬧,春花似錦纲爸、人聲如沸亥鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽负蚊。三九已至,卻和暖如春颓哮,著一層夾襖步出監(jiān)牢的瞬間盖桥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工题翻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揩徊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓嵌赠,卻偏偏與公主長得像塑荒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姜挺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 基本類型 在 Kotlin 中齿税,所有的東西都是對象,這就意味著我們可以調(diào)用任何變量的成員函數(shù)和屬性炊豪。一些類型是內(nèi)建...
    Gavin_2020閱讀 890評論 0 1
  • Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基礎(chǔ)語法(一) 本人也是在初學(xué)Kotlin凌箕,如有錯誤,請幫忙指出词渤,持...
    拖鞋王子豬閱讀 2,083評論 0 2
  • 在 Kotlin 中牵舱,所有的東西都是對象,這就意味著我們可以調(diào)用任何變量的成員函數(shù)和屬性缺虐。一些類型是內(nèi)建的芜壁,它們的...
    Jancd閱讀 327評論 0 0
  • 基本類型 在 Kotlin 中,所有的東西都是對象高氮,這就意味著我們可以調(diào)用任何變量的成員函數(shù)和屬性慧妄。一些類型是內(nèi)建...
    小浩_w閱讀 313評論 0 0
  • 本文是學(xué)習(xí)Kotlin的基本類型,Kotlin的基本類型與Java有一些不同剪芍,例如整數(shù)類型塞淹,Java是int表示,...
    叫我旺仔閱讀 2,976評論 4 5