iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Mobile Development

Android Studio 30天進階學習系列 第 8

Android Studio 30天進階學習-DAY08_Kotlin介紹-上

  • 分享至 

  • xImage
  •  

今天就來稍微帶一下之前有一段時間接觸過的Kotlin語法進行Android Studio的學習開發,在帶一下最為基礎的幾個語法之前,我要先來說明位什麼要學Kotlin這個程式語言。

Kotlin是我接觸Android開發學習時就有聽過的一種語言,個人認為這是目前Android Studio開發者可能最為常用的一種開發語言,許多有關Android的套件的教學都是以Kotlin為主進行的,這導致不會這個語言基礎在學習的路上會到處碰壁。

一些常見的N大型態,如:Int、String、Boolean、Char、Float、Double...的這邊就不再多做介紹了。

現在就讓我們開始Kotlin的基礎語法、常見的判斷式、迴圈、陣列使用以及一些更進階用法。

var & val

這兩個是kotlin中最基本的變數型態
var是可以變更當中的參數,而val則是無法變更當中的參數。
https://ithelp.ithome.com.tw/upload/images/20230918/20150370nZElxLGlr9.png
上方這個就是因為 tag1 是設定成val型態,所以無法再透過後面進行覆蓋。
tag2 是設定為var型態,所以能在之後的程式碼中利用覆蓋的方式蓋過原來的數值。
https://ithelp.ithome.com.tw/upload/images/20230918/20150370mNsLfpEoOk.png

指定型態建立

  • 第一種是直接套型態
    如同上面的使用方式就是var 變數名稱 : 型態 = 參數的方式
  • 第二種是直接寫參數讓他自己判定是哪個型態
    如以下的方式
    var name = "Kotlin"
    var year = 2023
    
    // 透過 變數名稱::class.simpleName的方式就能知道型態是甚麼了。
    Log.e(TAG, "name的型態為:"+name::class.simpleName+"\nyear的型態為:"+year::class.simpleName)

https://ithelp.ithome.com.tw/upload/images/20230918/201503702QUXGdirNt.png

其他的if-else;when;for迴圈用法

        // if-else if-else 的使用方式
        val result1 = if (name.equals("Kotlin")) {
            "This is Kotlin"
        } else if (name.equals("Java")) {
            "This is Java"
        } else {
            "This is other language"
        }
        // 若判斷的東西是較少的就能使用以下的if-else來縮減程式碼長度。
//        val result1 = if (name.equals("Kotlin")) "This is Kotlin" else "This is Java"
        Log.e(TAG, "result1:"+result1)

        // when 的使用方式
        val result2 = when (name) {
            "Kotlin" -> "This is Kotlin"
            "Java" -> "This is Java"
            else -> "This is other language"
        }
        Log.e(TAG, "result3:"+result2)

        // for-loop 的使用方式
        for (i in 1..5) {
            Log.e(TAG, "i:"+i)
        }

https://ithelp.ithome.com.tw/upload/images/20230918/20150370l3LpEYLAhv.png

Array的建立以及新增陣列長度

// 若需要後續新增陣列長度,則前面的型態必須為var,不然會無法增加。
var array = arrayOf("Kotlin", "Java", "Python")

// 使用plus的方式加入字串
array = array.plus("C++")

// 若有另一個陣列,並且想要加入原來的陣列中,可以使用以下的方法
val index :Array<String> = arrayOf("C", "C++", "C#", "JavaScript")
array = array.plus(index)

// 使用for迴圈遍歷陣列的內容
for (i in array.indices) {
    Log.e(TAG, "array["+i+"]:"+array[i])
}
  • 元陣列
    https://ithelp.ithome.com.tw/upload/images/20230918/20150370pFYMZashVP.png
  • 加入其他陣列
    https://ithelp.ithome.com.tw/upload/images/20230918/20150370izXMh5FEUq.png

權限修飾符

什麼是權限修飾符?
就是我們在寫java時前面所加入的privatepublic這類指定這個變數是否能夠在外部直接存取的變數就是權限修飾符

在Kotlin中也有這類的標示。

修飾符 private protected internal public
可在相同類別中存取 Yes Yes Yes Yes
可在子類別中存取 No Yes Yes Yes
可在相同模組中存取 No No Yes Yes
可在模組外存取 No No No Yes

由於privatepublic是非常常見的用法,這邊只展示protectedinternal在個別Class中的獲取。

  • protected
    • Name類別
    open class Name {
        private var name01: String = "Kotlin"
        protected var name02: String = "Java"
        internal var name03: String = "Kotlin"
        public var name04: String = "Java"
    
        // get name01
        @JvmName("getName01_")
        fun getName01(): String {
            return name01
        }
    
        @JvmName("getName02")
        fun getName02(): String {
            return name02
        }
    
        @JvmName("getName03")
        fun getName03(): String {
            return name03
        }
    
        // get name02
        @JvmName("getName04_")
        fun getName04(): String {
            return name04
        }
    
        fun setName01(name: String) {
            this.name01 = name
        }
    }
    
    • subName作為依附在Name之下的子類別中
    class NameSub: Name() {
    
        // 在Name類別中的protected
        var Name = name02
        // 並且包含了internal和public
    
        @JvmName("getName")
        fun getName(): String {
            return Name
        }
    }
    
  • internal
    這邊透過在MainActivity上建立var nameClass = Name()讓Name的類別import到MainActivity並賦予變數名稱nameClass。
// 在Name類別中的internal
nameClass.name03 = "Kotlin"
// 在Name類別中的public
nameClass.name04 = "Java"
  • 這邊可以看到subName依附在Name之下,可以使用Name中除了private以外的變數。
    https://ithelp.ithome.com.tw/upload/images/20230918/20150370QRlPCgfESd.png
  • 而在外部的MainAcitvity則只能取得後兩個internalpublic變數
    https://ithelp.ithome.com.tw/upload/images/20230918/20150370eW1HNUP9RK.png

函數的各項建立

  1. 指定型態的函數
    如同Name類別中的function寫法,撰寫的格式如下:
// 這個也能適用在getter & setter

// getter
fun 方法的名稱(): 方法的型態 {
    return 回傳值
}

// setter
fun 方法的名稱(傳入的變數: 傳入的指定型態) {
    this.本地變數 = 傳入變數
}

建構元/建構子寫法

撰寫了一年多的Android project,這段期間不免俗會用到constructor(建構元/建構子)的建立,這邊就稍微提一下怎麼在kotlin建立constructor。

這邊我建立了一個bmi類別,並使用Constructor傳入數值

class calculate(var weight:Int , var height:Int) {
    // bmi calculate formula
    fun bmi(): Float {
        if (height <= 0) {
            throw IllegalArgumentException("Height must be greater than zero.")
        }

        val heightInMeters = height.toFloat() / 100 // 轉換身高為米並轉換為浮點數
        val bmi = weight.toFloat() / (heightInMeters * heightInMeters)
        return bmi
    }
}
  • Kotlin建立constructor的格式
class "類別名稱"(變數01,變數02,...){
    // 建立一些方法來使用這些傳入的變數
}

在昨天的DataBinding中就有用到這個方法。

  • java建立constructor的格式
public class UserInfoModel {
    // 省略變數建立
    
    // 這個就是Java中的建構元建立。
    public UserInfoModel(String name,String password) {
        this.name = name;
        this.password = password;
    }
    
    // getter & setter 省略

}

對比Java來說,Kotlin建立建構元時省略了很多變數的建立。

  • 結果輸出
    https://ithelp.ithome.com.tw/upload/images/20230918/20150370vKRNA8urHv.png

結論

今天零零總總彙整了一些基本的型態、判斷式、for迴圈,後面又總結了幾個知識點:函數的建立、建構元/建構子的建立還有權限修飾符的詳細說明。

因為感覺有些雜亂所以建立了目錄標籤,方便指引到想看的地方。


上一篇
Android Studio 30天進階學習-DAY07_DataBinding的介紹
下一篇
Android Studio 30天進階學習-DAY09_Kotlin介紹-下
系列文
Android Studio 30天進階學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言