[Day 3] 變數 (Variables)
首先先來看一下, Kotlin 裡跟 Java 一樣有著 package 的概念, 所以我按照每天分成了不同的 package, 裡面目前程式名稱都叫 App.kt
val v.s var
首先先來看在 Kotlin 中, 有著兩種不同的變數宣告的方式
- val
- 唯讀的變數 (read-only variable)
- var
- 可修改的變數 (variable)
從下圖可以看到, 以關鍵字 val 宣告的 name, 想要變更其值時, 會有錯誤!
如果想要修改值, 就像 name2 以 var 宣告, 後續才能對 name2 做修改
String template
在 println 裡面的字串使用了 String template
使用 "$變數" 如此就可以在字串中顯示變數的內容
println("Hello world! $name2")
在 Kotlin 裡面, 從一開始設計就有注重在可變(mutable)和不可變(Immutable)這件事上面, 這是一個非常好的設計
沒有指定變數類型?- 類型推斷 (type inference)
這裡要注意到, 我根本沒有指定 name, name2 的 type!? Kotlin 不是強型別的語言嗎?
其實是因為 Kotlin 有 類型推斷 (type inference) 的功能, 所以即使今天不宣告變數的類型, Kotlin 也會自動幫你推斷出來
以下是有指定變數類型的寫法
fun main() {
val name: String = "Tim" // read-only variable
// name = "Alex"
println("Hello world! $name")
var name2: String = "Tim" // variable
name2 = "Alex"
println("Hello world! $name2")
}
Show Kotlin Bytecode
當我們對於 Kotlin 的語法有些好奇的時候, 其實我們可以透過 IntelliJ IDEA 內建的功能來查看 Kotlin 的 bytecode
在 App.kt 上連續按下 Shift 2次, 輸入 Show Kotlin Bytecode
右方就會出現, 一堆看不懂的 bytecode, 此時再按下 Decompile
這時候就會發現, Java 語法出現啦
這裡看到了, Kotlin 自動幫我們產生了 String name, name2..., 既使我們沒有宣告變數的類型
看到這裡, 讓我們再來好好看一下如何宣告一個完整的 "變數"
讓我們解釋一下整個變數宣告的語法:
一開始宣告 唯獨(val) 或 可以修改(var) 的關鍵字, 接著是變數名稱 name, 接著才是宣告 變數的類型(variable type), 最後用 = 號指定 "Tim" 這個字串到變數 name 上面。
把變數類型宣告放在後面, 這樣的宣告方式有別於原本 Java 宣告時, 是把變數類型放在前面, 這點要特別注意。
Const
最後在介紹以下寫法
const val FILE_PATH: String = "/test"
透過查看 bytecode 這樣的寫法就等同於 Java 的
public static final String FILE_PATH = "/test";
代表的是一個靜態且完全不可修改的變數
注意, 如同 public static final String 在 Java 裡通常是宣告在 method 外面, 這裡也是, 如果宣告在 fun 裡面, 是不允許的
為什麼要用這樣的語法呢? val 不就代表不能修改了嗎? 這個日後會再看到 val 並不能保證一定不能修改的例子, 所以才會有 const 的用法。
null 和 ?
讓我再來做一個實驗, 把 name3 指定為 null
發現是不行的!? Null can not be a value of a non-null type String
Kotlin 的變數預設是不能是 null 的!這樣可以讓我們保持良好的習慣, 讓在編譯的時候就能發現這樣的錯誤
這個設計也是 Kotlin 的一大優點, 要賦予 null 給變數, 要像這樣寫才能作用
var name3: String? = "Tim"
name3 = null
要加上變數類型和?,這個變數才能賦予 null
因為在 Java 的開發中, 或其他有 null 值的語言中, NullPointerException 實在太常發生了, 而且往往會造成整個程式的崩潰, 如果試著在 stack overflow 搜尋 NullPointerException, 就有8萬多個問題!
Kotlin 這樣的設計就是為了讓 null 的狀況減少, 在後面往後幾天, 會有更多 null safety 的介紹。
以上就是今天的介紹喔!我們明天見!
今日練習的程式在這: 請點我