成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

從零開(kāi)始學(xué) Kotlin 之「2」數(shù)據(jù)類(lèi)型

Awbeci / 3270人閱讀

摘要:前言大家好,這里是從零開(kāi)始學(xué)之?dāng)?shù)據(jù)類(lèi)型,本文首發(fā)于公眾號(hào),歡迎前往大家關(guān)注。輸出布爾類(lèi)型中的布爾類(lèi)型用表示,它的值有和。若需要可空引用時(shí),布爾類(lèi)型的值會(huì)被裝箱。此時(shí)程序會(huì)拋出異常最后從零開(kāi)始學(xué)之?dāng)?shù)據(jù)類(lèi)型到這里就結(jié)束了。

前言

大家好,這里是「從零開(kāi)始學(xué) Kotlin 之『2 』數(shù)據(jù)類(lèi)型」,本文首發(fā)于公眾號(hào)「Binguner」,歡迎前往大家關(guān)注。我會(huì)每周分享一些關(guān)于 Android 和其他方向的技術(shù)干貨或一些關(guān)于認(rèn)知的文章。學(xué)習(xí)一門(mén)技術(shù)最好的方式就是去教會(huì)別人,所以,開(kāi)始今天的學(xué)習(xí)吧!

Kotlin 中的數(shù)據(jù)類(lèi)型有基本數(shù)據(jù)類(lèi)型應(yīng)用類(lèi)型

基本數(shù)據(jù)類(lèi)型值直接存在了變量

應(yīng)用類(lèi)型的變量存儲(chǔ)的是類(lèi)型所指對(duì)象的存儲(chǔ)地址

并且對(duì)于基本的數(shù)據(jù)類(lèi)型(類(lèi)似于 int,float 等),Kotlin 不會(huì)區(qū)分其是數(shù)據(jù)類(lèi)型還是包裝類(lèi)型,在運(yùn)行的時(shí)候,數(shù)據(jù)會(huì)用最高效的方式顯示。

01 數(shù)字

Kotlin 提供了與 Java 類(lèi)似的數(shù)字類(lèi)型

類(lèi)型 位寬度
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
01 - 1 轉(zhuǎn)換函數(shù)

但是要注意:Kotlin 中沒(méi)有隱式轉(zhuǎn)換(就像 Java 中可以把 Int 轉(zhuǎn)換為 Long),想要進(jìn)行數(shù)字轉(zhuǎn)換,需要使用轉(zhuǎn)換函數(shù)

val a:Byte = 1
val b:Int = a  // 錯(cuò)誤,編譯器會(huì)提示所需類(lèi)型為 Int,而提供的類(lèi)型為 Byte
val c:Int = a.toInt()  // 成功

每種數(shù)字類(lèi)型都支持以下的數(shù)字轉(zhuǎn)換方法:

toByte(): Byte

toShort(): Short

toInt(): Int

toLong(): Long

toFloat(): Float

toDouble(): Double

toChar(): Char

01 - 2 裝箱和拆箱

裝箱是指將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換為其對(duì)應(yīng)的包裝器類(lèi)型,
拆箱就是將包轉(zhuǎn)器類(lèi)型轉(zhuǎn)換為基本數(shù)據(jù)類(lèi)型。

在 Java 中:

Integer x = 123;  // 是一個(gè)裝箱操作
int y = x;   // 是一個(gè)拆箱操作

而 Kotlin 中如何裝箱拆箱呢?

val i1 = 123  // 拆箱
val i2:Int? = 123 // 裝箱

想要了解其背后具體原理,可以自己動(dòng)手將 Kotlin 代碼編譯成 Java 字節(jié)碼一探究竟。

02 字面常量

為基本數(shù)據(jù)類(lèi)型賦值的值稱(chēng)為字面常量。

Kotlin 中的字面常量有以下三種:

十進(jìn)制

類(lèi)似:123,Long 類(lèi)型的用大寫(xiě) L 標(biāo)記:123L

十六進(jìn)制

類(lèi)似:0x0F

二進(jìn)制

類(lèi)似:0b00001011

另外,Kotlin 并不支持八進(jìn)制。但卻默認(rèn)支持 Double 和 Float。
例如:123.5,123.4e10,123f,123F 這些在 Kotlin 中都是支持的。

在聲明字面常量時(shí),Kotlin 支持下劃線的聲明方式,使數(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
03 字符

Kotlin 中的字符使用 Char 表示,字符不能直接被當(dāng)作數(shù)字來(lái)處理,必須通過(guò) toInt() 方法被字符轉(zhuǎn)換為數(shù)字類(lèi)型

fun charToInt(c:Char):Int{
    return c.toInt()
}

Char 類(lèi)的字面量用「" "」括起來(lái),支持如下的轉(zhuǎn)義序列:

t

b

n

"

"

$

04 字符串

Kotlin 中的字符串和 Java 一樣用 String 申明,且不可變的。但是 Kotlin 中的字符串有一些新的特性。

04 - 1 新特性

通過(guò)下標(biāo)訪問(wèn)字符串中的單個(gè)字符

val str = "Hello world!"
for (i in 0..str.length-1){
    print("${str[i]}_")
}  // 輸出 H_e_l_l_o_ _w_o_r_l_d_!_

直接通過(guò)「+」操作符連接字符串

val s = "Hello" + "_"
println(s + "World")
// 輸出 Hello_World
04 - 2 字符串處理

用 split() 分割字符串(split 函數(shù)的參數(shù)是一個(gè) Regex 對(duì)象,寫(xiě)好正則表達(dá)式后用 toRegex() 方法即可)

println("123_456_789".split("_".toRegex()))
// 輸出 [123, 456, 789]

用其它方法分割字符串

substring() 從指定位置開(kāi)始分割字符串,或者提取指定范圍的字符串

substringBefore() 分割掉指定位置之后的字符串

substringAfter() 分割掉指定位置之前的字符串

substringBeforeLast() 分割最后一個(gè)指定字符之后的字符串

substringAfterLast() 分割最后一個(gè)指定字符之前的字符串

val str = "Hello world!"
println("substring1: ${str.substring(5)}")
println("substring2: ${str.substring(0..4)}")
println("substring3: ${str.substring(6,12)}")
println("substringBefore: ${str.substringBefore(" ")}")
println("substringAfter: ${str.substringAfter(" ")}")
println("substringAfter: ${str.substringBeforeLast(" ")}")
println("substringAfterLast: ${str.substringAfterLast(" ")}")

// 運(yùn)行結(jié)果:
substring1:  world!
substring2: Hello
substring3: world!
substringBefore: Hello
substringAfter: world!
substringAfter: Hello
substringAfterLast: world!
04 - 3 原始字符串

原始字符串用前后 3 個(gè)引號(hào)包圍

val rawStr =
        """
        The first line,
        the second line,
        the third line.
        """.trimIndent()  // 注意:如果「"""」所在行只有空格,這個(gè)方法會(huì)省略這些空白
    println(rawStr)
// 輸出:
The first line,
the second line,
the third line.

原始字符串通常還用 trimMargin() 處理,trimMargin() 的參數(shù)是一個(gè)邊界前綴字符串,默認(rèn)的參數(shù)是「|」,例如下面的例子,每一行的開(kāi)頭是「|」,那么就會(huì)以每一行的「|」為輸出的開(kāi)頭進(jìn)行字符輸出。

val rawStr = 
            """
            |   The first line,
        |the second line,
        |the third line.
    """.trimMargin("|")
// 輸出:
   The first line,
the second line,
the third line.
05 布爾類(lèi)型

Kotlin 中的布爾類(lèi)型用 Boolean 表示,它的值有 true 和 false。
若需要可空引用時(shí),布爾類(lèi)型的值會(huì)被裝箱。

它支持的運(yùn)算有:

|| 短路邏輯或

&& 短路邏輯與

! 邏輯非

06 可空的基本數(shù)據(jù)類(lèi)型

Kotlin 致力于消除 NullPointerException 帶來(lái)的影響。在 Java 中如果我們嘗試引用一個(gè)空的對(duì)象,就會(huì)導(dǎo)致空指針異常,但是在 Kotlin 中則不會(huì)。下面,我們來(lái)看看 Kotlin 是怎么做到的。

Kotlin 對(duì)可空類(lèi)型和非空類(lèi)型做了區(qū)分,例如:「Int」不可空,「Int?」可空

var str :String? = null
println(str?.length)
// 輸出 null,而不是報(bào)空指針異常

在引用可空類(lèi)型的時(shí)候,為了避免空指針異常,Kotlin 要求必須進(jìn)行非空檢查:

var str :String? = "Hellp"
// val length1 = str.length 這樣直接引用的時(shí)候,編譯器會(huì)報(bào)錯(cuò)
//  Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
// 必須在可空類(lèi)型上使用可空和非空斷言。
val length = str?.length  // 此時(shí)如果 str 為空,運(yùn)行返回 null
val length2 = str!!.length  // 此時(shí)如果 str 為空,運(yùn)行會(huì)拋出異常
// 或者進(jìn)行類(lèi)型檢查
val length3 = if(str != null) str.length else 0
07 Kotlin 中的一些其它類(lèi)型 07 - 1 Any、Any?

Any 是 Kotlin 中所有非空類(lèi)型的超類(lèi),相當(dāng)于 Java 中的 Object。
可空類(lèi)型的超類(lèi)是 Any?

07 - 2 Unit

Unit 可以作為函數(shù)的返回類(lèi)型,表示沒(méi)有返回值或者返回值可以忽略。
注意 Unit 是一個(gè)類(lèi),并且繼承自 Any。

這是定義它的源代碼:

public object Unit {
    override fun toString() = "kotlin.Unit"
}

可以看到 Unit 是用 object 定義的單例類(lèi)型,調(diào)用它的 toString() 方法,只會(huì)返回 「Kotlin.Unit」。

并且 Unit 的返回類(lèi)型會(huì)返回 Unit 類(lèi)型!??!

fun test(){}
val t = test()
println(t::class.java)
// 輸出 class kotlin.Unit
07 - 3 Nothing

Kotlin 中函數(shù)返回類(lèi)型如果用 Nothing 表示,則這個(gè)函數(shù)永遠(yuǎn)不會(huì)返回任何類(lèi)型。

一些測(cè)試函數(shù)不會(huì)返回任何類(lèi)型,就需要聲明返回類(lèi)型為 Nothing,它們通常拋出異常來(lái)結(jié)束運(yùn)行。

fun test(msg:String):Nothing{
    throw IllegalStateException(msg)
}

test("test")
// 此時(shí)程序會(huì)拋出異常:Exception in thread "main" java.lang.IllegalStateException: test
最后

「從零開(kāi)始學(xué) Kotlin 之『2』數(shù)據(jù)類(lèi)型」到這里就結(jié)束了。

一下記住這么多知識(shí)點(diǎn)有些困難,所以為了方便大家的記憶與復(fù)習(xí),我做了一張思維導(dǎo)圖放到下面,大家可以把圖片保存下來(lái),有時(shí)間便去回顧學(xué)到的東西。

推薦閱讀:

從零開(kāi)始學(xué) Kotlin 之「1」基礎(chǔ)篇

歡迎關(guān)注本文作者,這個(gè)系列的文章會(huì)首發(fā)在這里:

掃碼關(guān)注 + 回復(fù)「kotlin」,獲取我整理的最新版 Kotlin 學(xué)習(xí)視頻。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71707.html

相關(guān)文章

  • 從零開(kāi)始學(xué) Java 基礎(chǔ)語(yǔ)法(中)

    摘要:下面開(kāi)始今天的知識(shí),先看下基礎(chǔ)語(yǔ)法的總綱今天我們接著學(xué)習(xí)變量使用變量的注意事項(xiàng)數(shù)據(jù)類(lèi)型和類(lèi)型轉(zhuǎn)換。推薦閱讀從零開(kāi)始學(xué)之基礎(chǔ)語(yǔ)法上從零開(kāi)始學(xué)之基礎(chǔ)概述本文原創(chuàng)發(fā)布于微信公眾號(hào),編程思維成長(zhǎng)正能量,關(guān)注并回復(fù)編程閱讀等關(guān)鍵字獲取免費(fèi)學(xué)習(xí)資料 showImg(https://segmentfault.com/img/remote/1460000016134163); Java?基礎(chǔ)斷更一周了...

    chinafgj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<