1. 程式人生 > >【Kotlin從入門到深坑】之基礎型別

【Kotlin從入門到深坑】之基礎型別

簡介

本篇部落格主要是介紹Kotlin語法中的【基礎型別】相關的知識,幫助各位更快的掌握Kotlin,如果有疏漏或者錯誤,請在留言中指正,謝謝。 系列彙總地址

準備

在學習之前我們先有點基礎知識上的認識,如下:

  • Kotlin和java程式碼可以混合寫,也可以互調。

  • Kotlin中是不寫;的。

  • Kotlin中使用關鍵詞val表示常量,var表示變數

  • Kotlin中宣告變數的模板 var a:Int =1 => var 變數名:型別 = 值

基本型別

對於java中我們都很清楚基本型別有 byte、short、int、long、double、float、boolean、char 等,對於Kotlin中當然也有與其對應的,不過它們更像是java中的包裝類 比如int->Integer ,Kotlin中是Int


下面是對應關係(首字母變大寫)
- int->Int
- double->Double
- long->Long
- double->Double
- float->Float
- boolean->Boolean
- char->Char

對於Kotlin中所有東西都是物件,也就是說我們可以在任何變數上面呼叫屬性和成員變數。

數字

對於Kotlin數字的處理和java類似,但也略有不同,比如沒有隱式拓寬轉換(對於java中int型別的可以轉為long型別的),數字的表示上和java的類似,比如浮點值 12.8f,但Kotlin不支援8進位制數值

儲存原理

java平臺上(Kotlin可以編譯為javascript),數字預設是採用java的原生型別,也就是說Int是按照int儲存的。但如果我們要使用Int?(”?”表示可能為null,後續會講解)或者泛型,則數字會自動裝箱,也就是說Int按照Integer儲存。

需要注意的是數字裝箱不會保證同一性,但會保留相等性,舉個例子:

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) // 內容相同
val boxedA: Int? = a//自動裝箱
val anotherBoxedA: Int? = a//再次裝箱
print(boxedA == anotherBoxedA) //內容相同// Prints 'true'--相等性

此處簡單的說明一下”===”和”==” 的區別:

  • “===”表示的是否引用地址相同

  • “==” 表示內容是否相同,等同於equals(),比較其值是否相等

型別轉換

支援表示式形式的隱式轉換比如:

var a:Long =1L
var b:Int=1
var c=a+b //c是Long型的

但不支援

var a:Long =1L
var b:Int=a  //編譯報錯

或者

var b:Int=1
var a:Long =b //編譯報錯

但每個數字型別支援如下的轉換,用於顯式拓寬數字,需要轉換的時候可以使用如下函式。

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

字元

Kotlin中字元使用Char來表示,它們不能直接當做數字來處理(不同於java)。字元使用''進行括起來,使用特殊字元可以使用轉義字元\,支援這幾個轉義序列:\t、 \b、\n、\r、\'、\"、\\ 和 \$

布林值

Kotlin中使用Boolean來表示布林值,它可以儲存兩種型別的值true和false
支援的運算子如下:

  • || – 短路邏輯或
  • && – 短路邏輯與
  • ! - 邏輯非

陣列

Kotlin中使用Array類來表示陣列,它定義了getset函式(按照運算子過載,內部仍然使用[]來訪問)和size 屬性。
下面我們介紹一下如何建立陣列

  • 使用arrayOf建立陣列:var array: Array<String> = arrayOf("1", "b")

  • 使用arrayOfNulls建立陣列:var array3:Array<String?> = arrayOfNulls(5)//指定大小,並用null填充,此處宣告使用String?,表示此處內容可能為null

  • 使用Array建立陣列:val asc = Array(5, { i -> (i * i).toString() })// 前面的5是指定大小,後面的i是對應的索引0-4,{} 內的是初始化方法}

Kotlin 也有無裝箱開銷的專門的類來表示原生型別陣列: ByteArray、 ShortArray、IntArray 等等。這些類和 Array 並沒有繼承關係,但是 它們有同樣的方法屬性集。它們也都有相應的工廠方法。

字串

Kotlin中字串使用String來表示,字串是不可變的,可以使用s[i]的形式訪問其中的字元,也可以遍歷字串,訪問其中的字元。
Kotlin中有兩種字串,轉義字串和原生字串(不能使用轉義字元),下面介紹一下:

  • 轉義字串:這種類似於java的字串,val a:String="test word \n"
  • 原生字串:

    // 上下各三個 """ 引號包裹需要顯示的內容
    val a:String=
            """
            白雲黑土
            宇宙洪荒
            """  //此種字串會原樣輸出,保留此處的格式

字串模板

字串可以包含字串模板,就是一小段程式碼,它的作用就是把求值的結果合併到字串中,模板表示式使用$ 美元符號,下面舉例說明:

val a=10
val str="a的值是:$a"//輸出:a的內容是:10

還可以用於方法,比如:

val a="test"
val str="a的內容是:$a,長度是${a.length}"  //輸出:a的內容是:test,長度是4

字串模板支援原生字串和轉義字串。

總結

至此已經學完了Kotlin的【基礎型別】相關的知識,多回顧多思考,繼續後續內容