iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
Software Development

Kotlin 島深度之旅 30 天系列 第 3

[Day 3] Kotlin Journey - 變數 (Variables)

首先先來看一下, Kotlin 裡跟 Java 一樣有著 package 的概念, 所以我按照每天分成了不同的 package, 裡面目前程式名稱都叫 App.kt

https://ithelp.ithome.com.tw/upload/images/20200912/201299026EKOlH6o7T.png

val v.s var

首先先來看在 Kotlin 中, 有著兩種不同的變數宣告的方式

  • val
    • 唯讀的變數 (read-only variable)
  • var
    • 可修改的變數 (variable)

從下圖可以看到, 以關鍵字 val 宣告的 name, 想要變更其值時, 會有錯誤!

https://ithelp.ithome.com.tw/upload/images/20200912/20129902ockpX0i0o3.png

如果想要修改值, 就像 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

https://ithelp.ithome.com.tw/upload/images/20200912/20129902enp5f9pyOO.png

右方就會出現, 一堆看不懂的 bytecode, 此時再按下 Decompile

https://ithelp.ithome.com.tw/upload/images/20200912/20129902en1PsAmyxT.png

這時候就會發現, Java 語法出現啦

這裡看到了, Kotlin 自動幫我們產生了 String name, name2..., 既使我們沒有宣告變數的類型

https://ithelp.ithome.com.tw/upload/images/20200912/20129902ImSk6Q91Zv.png

看到這裡, 讓我們再來好好看一下如何宣告一個完整的 "變數"

https://ithelp.ithome.com.tw/upload/images/20200912/20129902y1yzcPgUxr.png

讓我們解釋一下整個變數宣告的語法:

一開始宣告 唯獨(val)可以修改(var) 的關鍵字, 接著是變數名稱 name, 接著才是宣告 變數的類型(variable type), 最後用 = 號指定 "Tim" 這個字串到變數 name 上面。

把變數類型宣告放在後面, 這樣的宣告方式有別於原本 Java 宣告時, 是把變數類型放在前面, 這點要特別注意。

https://ithelp.ithome.com.tw/upload/images/20200912/20129902VYT645Po2x.png

Const

最後在介紹以下寫法

const val FILE_PATH: String = "/test"

透過查看 bytecode 這樣的寫法就等同於 Java 的

public static final String FILE_PATH = "/test";

代表的是一個靜態且完全不可修改的變數

注意, 如同 public static final String 在 Java 裡通常是宣告在 method 外面, 這裡也是, 如果宣告在 fun 裡面, 是不允許的

https://ithelp.ithome.com.tw/upload/images/20200912/20129902xtkygpR04N.png

為什麼要用這樣的語法呢? val 不就代表不能修改了嗎? 這個日後會再看到 val 並不能保證一定不能修改的例子, 所以才會有 const 的用法。

null 和 ?

讓我再來做一個實驗, 把 name3 指定為 null

https://ithelp.ithome.com.tw/upload/images/20200912/20129902DBrp7zZOxB.png

發現是不行的!? 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萬多個問題!

https://ithelp.ithome.com.tw/upload/images/20200912/20129902MMs9wm6FfN.png

Kotlin 這樣的設計就是為了讓 null 的狀況減少, 在後面往後幾天, 會有更多 null safety 的介紹。

以上就是今天的介紹喔!我們明天見!

今日練習的程式在這: 請點我


上一篇
[Day 2] Kotlin Journey - 第一個 Kotlin 程式
下一篇
[Day 4] Kotlin Journey - 變數 (Variables) & 控制流程
系列文
Kotlin 島深度之旅 30 天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言