Kotlin教學 | 從零開始學Kotlin | Kotlin入門 | CH2: 變量(Variables)

變量

變量可以想像成是一個容器(Ex: 瓶子),容器內儲存需要的資料(Ex: 5公升)。
但是在使用這個容器之前,需要先宣告,宣告會告訴編譯器要儲存的資料的型別,型別決定了可以對資料做哪些操作(Ex: 算術運算或是文字串接)。

在Kotlin中,變量又分為兩種:valvar

  • val: 不可變變量,一旦賦值後,其值就不能被改變。
  • var: 可變變量,賦值後,其值可以再重新賦值改變。

不管是哪種變量,都分成兩個階段,分別是宣告使用

  • 第一階段 – 宣告:使用val(表示不可變變量)或var(表示可變變量)宣告變量的名稱和型別和同時賦值,或之後再賦值。
  • 第二階段 – 使用:指名變量名稱以使用。

宣告語法

宣告指定型別和賦值

val immutableVariable: Type = initialValue // 宣告不可變變量
var mutableVariable: Type = initialValue   // 宣告可變變量
  • val 關鍵字宣告一個不可變變量,一旦賦值後,其值就不能被改變。
  • var 關鍵字宣告一個可變變量,賦值後,其值可以再重新賦值改變。
  • Type 是變量的型別,如 IntString 等。
  • initialValue 是變量的初始值,必須與 Type 相匹配。

Example

val name: String = "John Doe" // 不可變變量宣告
var age: Int = 30             // 可變變量宣告
age = 31                      // 指名使用age變量,賦值31給age變量,age的值由30變成31。

宣告只指定型別

宣告變量時只指定型別,之後才對變量賦值。

val aVal: Int  // Type required when no initializer is provided
aVal = 3       // deferred assignment

var aVar: Int  // Type required when no initializer is provided
aVar = 2       // deferred assignment

宣告可空型別

Type後面加上問號符號 ? 表示是可空的型別(nullable),表示該變量除了可以儲存指定的型別值外,還可以儲存null

val aVal: Int? = 3

var aVar: Int?
aVar = null

宣告不指定型別

宣告變量時只有賦值,沒有指定型別,Kotlin會根據賦予的值推斷變量型別,又稱作Type Inference

val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1

型別(Type)

型別可以分成基本型別集合型別自定義型別,型別決定了變量可以存儲的數據類型和可以對這些數據進行的操作。

本章只先講解基本型別整數型別(ByteShortIntLong)、浮點數型別(FloatDouble)、BooleanCharString

數字

整數型別

Kotlin為整數數字提供了四種不同大小的型別,每種型別都有其特定的值範圍:

型別大小(位元)最小值最大值
Byte8-128127
Short16-32,76832,767
Int32-2,147,483,648 (-2^31)2,147,483,647 (2^31 – 1)
Long64-9,223,372,036,854,775,808 (-2^63)9,223,372,036,854,775,807 (2^63 – 1)

浮點數型別

對於實數,Kotlin提供了FloatDouble兩種浮點數型別,它們遵循IEEE 754標準。Float型別反映了單精度,而Double型別反映了雙精度。

型別大小(位元)有效位元數指數位元數小數位數
Float322486-7
Double64531115-16

型別轉換

Kotlin不像其他語言,範圍較小的型別不會自動轉換為範圍較大型別,需要呼叫轉換型別的方法轉換。

val b: Byte = 1 // 正確,字面量在靜態檢查時是OK的
// val i: Int = b // 錯誤,沒有進行顯式轉換
val i1: Int = b.toInt() // 進行顯式轉換

支持的顯式轉換: 所有的數值型別都支援轉換為其他型別的操作:

轉換方法轉換後的型別
toByte()Byte
toShort()Short
toInt()Int
toLong()Long
toFloat()Float
toDouble()Double

在許多情況下,其實並不需要顯式轉換,因為算術運算子(+)會被重載以進行適當的轉換。
例如,當LongInt進行算術運算時,結果將是Long型別:

val l = 1L + 3 // Long + Int => Long

整數除法

在Kotlin中,兩個整數進行除法運算時,任何小數部分都會被丟棄,結果會是一個整數。
這是因為整數除法只考慮整數部分的結果。

val x = 5 / 2
println(x == 2) // 輸出:true

如果希望除法結果是浮點數型別,需要將至少一個整數顯式轉換為浮點數型別:

val x = 5 / 2.toDouble()
println(x == 2.5) // 輸出:true

位運算

Kotlin提供整數進行位運算的操作。
位運算僅適用於IntLong型別。

位運算函數描述
shl(bits)有符號左移
shr(bits)有符號右移
ushr(bits)無符號右移
and(bits)and
or(bits)or
xor(bits)exclusive-or
inv()inverse

以下是一些位運算的範例:

val x = (1 shl 2) and 0x000FF000

Boolean

在Kotlin中,Boolean型別用來表示邏輯值,它有兩個可能的值:

  • true
  • false

你可以使用邏輯運算符,如&&(邏輯與)、||(邏輯或)和!(邏輯非):

  • || – disjunction (logical OR)
  • && – conjunction (logical AND)
  • ! – negation (logical NOT)

||&& 運算子是最小化求值 (Short-circuit evaluation),這意思是

  • 如果||左邊的運算式為true|| 不會繼續執行右邊的運算式。
    因為左邊的運算式為true時,||整個運算式已經為true,沒必要繼續計算右邊運算式。
  • 如果&&左邊的運算式為false&& 不會繼續執行右邊的運算式。
    因為左邊的運算式為false時,&&整個運算式已經為false,沒必要繼續計算右邊運算式。

fun main() {
    val myTrue: Boolean = true
    val myFalse = false	//Type Inference
    val boolNull: Boolean? = null

    println(myTrue || func())   // only print true, func() is not executed
    println(func() || myTrue) //print func is executed true    
    
    println(myTrue && myFalse) // false
    println(!myTrue) // false
    println(boolNull)  // null

}
fun func() : Boolean {
    print("func is executed ")
    return false
}

Char

在Kotlin中,字元由Char型別表示,字元使用單引號' '包住表示。例如,'A'表示一個字元A

Special characters

特殊字元是具有特殊意義的字元,能夠在字串中表示無法直接鍵入或有特殊意義的字元,它們會用\ (escaping backslash)開頭。

特殊字元描述
\t插入一個制表符(Tab)。
\b插入一個退格(Backspace)。
\n插入一個換行符(New Line)。
\r插入一個回車符(Carriage Return)。
\'插入單引號字元。
\"插入雙引號字元。
\\插入一個反斜線。
\$插入一個美元符號。
\uXXXX插入一個Unicode代碼XXXX對應的字元。
val aChar: Char = 'a'

println(aChar)
println('\n') // Prints an extra newline character
println('\u0041') // A

String

在Kotlin中,雙引號" "包起來表示String型別,"12"代表是字串型別,"12"+"34"程式就會知道是"12""34"兩個字串相加, 得到的結果是字串: "1234"

  • 字串中的每個元素都是一個字元,你可以透過索引操作來訪問這些字元。
  • 可以使用for迴圈遍歷字串中的每個字元。

Example

var str = "abcd" // 宣告字串型別變量str

println(str[1]) // 通過索引操作存取字串中的元素,'b'

for (c in str) { //使用 for 迴圈遍歷這些字元
    println(c)
}

字串的串接

要串接字串,可以使用+運算符。
這同樣適用於將字串與其他型別的值串接起來,只要表達式中的第一個元素是字串:

val s = "abc" + 1 //abc1
println(s + "def") // abc1def

字串模板 ( String templates )

在Kotlin中,字串模板是一種強大的特性,它允許你在字串中插入變量值或表達式的結果。
字串模板以符號$開始,後面可以是變量名稱或包在大括號{}中的表達式。

插入變量:當插入單個變量時,只需在變量名前加上$符號。

val i = 10
println("i = $i") // 輸出:i = 10

插入表達式:如果想在字串中插入一個表達式的結果,需要將表達式放在${}中。

println("sum is ${1+1}") // sum is 2

Type Inference

宣告變量時只有賦值,沒有指定型別,Kotlin會根據賦予的值推斷變量型別。

整數型別推斷

  • 默認整數推斷為Int:整數值沒有超出Int範圍,會被推斷為Int
  • 超出Int範圍的整數推斷為Long:整數值超出了Int範圍,會被推斷為Long
  • Long需要明確指定:整數後面加上Ll(建議使用大寫L以避免與數字1混淆),會被推斷為Long
  • ByteShort需要明確指定:必須特別指定型別是ByteShort,才會被推斷為ByteShort
    如果沒有指定型別,即使數值在ByteShort的範圍內,Kotlin並不會自動推斷為ByteShort
    因為Kotlin的型別推斷默認整數推斷為Int,或超出Int範圍的整數推斷為Long
val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1

浮點數型別推斷

  • 默認浮點數推斷為Double
  • Float需要明確指定:浮點數後面加上Ff,會被推斷為Float
    如果浮點數超出Float範圍,則會四捨五入。
val e = 2.7182818284 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817

Boolean、Char、String型別推斷

BooleanCharString不像數字型別需要考慮範圍,Kotlin直接推斷。

val isBool = true //Boolean
val ch = 'A' //Char
val str = "string" //String

Reference

https://kotlinlang.org/docs/numbers.html

https://kotlinlang.org/docs/booleans.html

https://kotlinlang.org/docs/characters.html

https://kotlinlang.org/docs/strings.html

https://kotlinlang.org/docs/basic-syntax.html#variables

https://kotlinlang.org/docs/kotlin-tour-basic-types.html

發佈留言