Kotlin入門-萬物皆對象,基礎類型

在這裏插入圖片描述

Kotlin說:萬物皆對象。

可以說,Kotlin全面的接管了所有類型。一統天下。

即是基礎,那就需要,通盤瞭解。按目錄來就行。也有Xmind版本 github地址

本文將從下面幾個方面去講解

  • 數字
    • 整數
    • 浮點數
    • 數字可添加下劃線,更易讀
    • 表示方式
    • 顯式轉換
    • 運算
    • 浮點數比較
  • 字符
  • 布爾值
  • 數組
  • 字符串
    • 字符串模板
    • 字符串字面值
  • 無符號

數字

數字包括 整數和浮點型

整數
類型 大小 限制
Byte 8位
Short 16位
Int 32位 所有不超過Int最大值的整數型初始化變量都被推斷爲Int
Long 64位 初始值超過Int最大值,推斷爲Long
注意
  • 不支持8進制
  • long以大寫的 L 結尾:123L
  • 16 進制以 0x 開頭:0x0F
  • 2 進制以 0b 開頭:0b00001011

浮點數
類型 大小 限制 示例
Float 32位 使用 f 或者 F 後綴可 顯式指定爲Float類型 123.5f
Double 64位 以小數初始化的變量推斷爲Double 123.5, 123.5e10

數字可添加下劃線,更易讀

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


表示方式

數字的賦值會被默認裝箱,即 新變量的定義,代表了新對象的產生

    val a: Int = 10000
    println(a === a) // true,值相等,對象地址相等

    //經過了裝箱,創建了兩個不同的對象
    val boxedA: Int? = a
    val boxedB: Int? = a

    //雖然經過了裝箱,但是值是相等的,都是10000
    println(boxedA === boxedB) //  false,值相等,對象地址不一樣
    println(boxedA == boxedB) // true,值相等

這裏數值的比對

  • ===
    表示比較對象地址
  • ==
    表示比較兩個值大小

boxedA跟boxedB的地址不同,
賦值,就是重新new 兩個對象


顯式轉換

每種數值都是獨立的
較小類型並不是較大類型的子類型
數值類型之前,必須通過顯式的轉換

範例

val b: Byte = 1 // OK, 字面值是靜態檢測的
val i: Int = b // 錯誤
Type mismatch: inferred type is Byte but Int was expected
val i: Int = b.toInt() // OK:顯式拓寬

類型推斷可以

  • 從上下文得出
  • 有重載做適當轉換
  • val l = 1L + 3 // Long + Int => Long

每個數字類型支持如下的轉換:

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

運算

這部分基本跟與java一樣
位運算

  • 沒有特殊字符來表示
  • 只可用中綴方式調用命名函數
val x = (1 shl 2) and 0x000FF000

位運算列表如下(只用於Int和Long類型)

  • shl(bits) – 左移位 (Java’s <<)
  • shr(bits) – 右移位 (Java’s >>)
  • ushr(bits) – 無符號右移位 (Java’s >>>)
  • and(bits) – 與
  • or(bits) – 或
  • xor(bits) – 異或
  • inv() – 反向

浮點數比較

與java一樣的部分:

  • 相等性檢測:a == b 與 a != b
  • 比較操作符:a < b、 a > b、 a <= b、 a >= b
  • 區間實例以及區間檢測:a…b、 x in a…b、 x !in a…b

若a\b的類型已知或可推導。
當這些操作數並非靜態類型爲浮點數,會出現

  • 認爲 NaN 與其自身相等
  • 認爲 NaN 比包括正無窮大(POSITIVE_INFINITY)在內的任何其他元素都大
  • 認爲 -0.0 小於 0.0

字符

  • 大體與java一樣
  • 用 Char 類型表示
  • Char 必需是單引號 ’ 包含起來的

和 Java 不一樣部分
Kotlin 中的 Char 不能直接當作數字,與數字操作


布爾

與java一樣

數組

創建兩種方式
arrayOf(1, 2, 3)
// 創建一個 Array<String> 初始化爲 ["0", "2", "4"]
Array(3, { i -> (i * 2) })

Array中的{}代表了進行數值生成

若{}中沒有內容,則輸出Kotlin.Unit(Unit約等於void)

除了類Array,還有ByteArray, ShortArray, IntArray
範例
// Array of int of size 5 with values [0, 0, 0, 0, 0]
val arr = IntArray(5)

// e.g. initialise the values in the array with a constant
// Array of int of size 5 with values [42, 42, 42, 42, 42]
val arr = IntArray(5) { 42 }

// e.g. initialise the values in the array using a lambda
// Array of int of size 5 with values [0, 1, 2, 3, 4] (values initialised to their index value)
var arr = IntArray(5, { it * 1 })

這個範例很好的解釋了初始化數值會如何生成


字符串

字符串是不可變的。改變字符串,本質是重新賦值一個新的字符串。

字符串模板
  • 模板表達式以美元符($)開頭
  • 用花括號括起來的任意表達式
"i = $i"
"$s.length is ${s.length}" //輸出“abc.length is 3”
val price = """
${'$'}9.99
"""
// 輸出$9.99  
字符串字面值
原始字符串 使用三個引號(""")
  • 默認 | 用作邊界前綴
  • 可以選擇其他字符並作爲參數傳入
  • 比如 trimMargin(">")

範例

val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()
轉義字符串 使用一個引號(")

無符號

無符號類型自 Kotlin 1.3 起纔可用,並且目前是實驗性的。

既然是實驗性的,瞭解就好。等穩定了再用吧。
大致就是這樣的東西。

kotlin.UByte
kotlin.UShort
kotlin.UByteArray
kotlin.ULongArray
val b: UByte = 1u  // UByte,已提供預期類型
val s: UShort = 1u // UShort,已提供預期類型
val l: ULong = 1u  // ULong,已提供預期類型

val a1 = 42u // UInt:未提供預期類型,常量適於 UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong:未提供預期類型,常量不適於 UInt

附上 github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章