0%

kotlin-note

var & val

  • var
    • 變數,內容可更改
  • val
    • 常數,給值時定型,就不可在更改了,改了會出錯
  • 宣告時 val | var name[:Type] = value
    • 給定宣告類型
      • 可以不用給初始值
      • 必須要設定好類型
      • 還未給值時無法使用
      • 說明
        1
        2
        var i:Int
        i = 10
    • 自動轉換類型
      • 一定要設定好初始值
      • 變數類型由值來決定
      • 說明
        1
        var i = 10
    • PS. 類型決定好後不能再用自動轉換來更改

      關於變數 ? & !!

  • 普通設定時,變數是不會有 null值

    有需要的話,需要變數類型後面加上

    而因為有 null值,導致變數不確定是還是,出於安全考量,編譯器會出現錯誤,

    當使用者堅持變數不會有 null值,可在變數後面加上 !!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class RecentUseComparator:Comparator<UsageStats> {
    override fun compare(lhs: UsageStats?, rhs: UsageStats?): Int {
    return if(lhs!!.lastTimeUsed > rhs!!.lastTimeUsed){
    -1
    }else if(lhs!!.lastTimeUsed == rhs!!.lastTimeUsed){
    0
    }else{
    1
    }
    }
    }

基本類型

  • Number Type

    • 整數
      • Long : -2^63-1 ~ 2^63
      • Uint : 2^32
      • Int : -2^31-1 ~ 2^31
      • Short : -2^15-1 ~ 2^15
      • Byte : -2^7-1 ~ 2^7
    • 浮點數
      • Float : -2^31-1 ~ 2^31
      • Double : -2^63-1 ~ 2^63
  • String Type

    • char

      • 字元
      • 只能容納一個符號
      • 包起來
    • String

      • 字串
      • 字元的集合體
      • 包起來
    • Template Literals

      • 字串板模
      • 以一個字串為模型,把變數塞進來
      • 要塞進來的變數前面要帶 $ name
      • 如要做運算需加 {arg…}
      1
      2
      3
      4
      5
      6
      7
      var c:Char = 'F'
      var s1:String = "Hello"
      var s2 = "World"
      var i = 10;
      var j = 20;

      println("$s1 $s2 , i + j = ${i+j}")

      Function

  • 函式 fun為關鍵字

  • 宣告為 fun name(arg1:Type...)[:ReturnType]{ .... }

  • 可重複使用的邏輯

  • 需呼叫才會啟用,呼叫為 name(arg1,arg2)

  • 可設定外部變數帶入,在()裡面設定

    • 多個參數以 , 隔開
    • 帶入參數需要設定帶入類型 arg:Type
  • 非全域變數,無法直接使用

  • { 開始 , } 結束

  • 做完即結束,返回呼叫的地方

  • 可有或沒有返回值

    • 有返回值需設定 Return Type
  • 只有返回值可以用等號 = 把動作寫完

    1
    2
    3
    4
    5
    6
    fun testFn(arg:Int):Int{
    return 10
    }

    //return this is xxx
    fun testFn2(v:Int) = println("this is ${v}")

存取修飾 Access Modifier

  • public - 完全公開
  • internal - 只有此 *.kt 可看到
  • protected - 自己 + 繼承者可看到
  • private - 只有自己

    PS.預設為 public

oject

  • class 關鍵字
  • 物件的草圖
  • 聲明為 class name {}
  • 建構子分主、副
    • 主建構子
      • 只能有一個,為建立物件默認選項
      • 寫在 class name[constructor(arg:Type ....)]
      • 實作部分寫在 class 內部,加上init{}
    • 副建構子
      • 可以根據不同條件分配多個建構子
      • 寫在 class 內部,加上constructor(){}
      • 若要繼承主建構子的動作 ,constructor():this(arg){}
  • proterty
    • 包含 getter & setter
    • 無設定有是單存變數存取
    • 有設定在變數下方做設定
      • set(value)
        • 以 function 的方式,帶入設定值
        • set(value){ }
      • get()
        • 以 function 的方式,將變數丟出去
        • get(){ retrun name }
      • field
        • 指向變數自己本身
        • 使用此欄位,變數需要初始值
  • 繼承 inherit
    • 關鍵字 open,寫在 class 前面
    • 有關鍵字才允許繼承
    • 繼承者要在聲明最後加上 class sub constructor():FatherClass
    • override
      • 關鍵字 open,寫在 fun 前面
      • 有關鍵字才允許 override
      • 關鍵字 override,當繼承者想要使用時,寫在 fun 前
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        open class human(){
        var sex:String = "man"
        set(value) {
        field = value
        }
        get() = field
        var age:Int = 0

        init{

        }

        open fun speak(v:String) = println(v)
        open fun see(v: String) = println(v)
        }
        class User:human() {
        var name = ""
        var userName
        get() = "~$name~"
        set(v){
        name = v
        }

        override fun speak(v: String) {
        println("I'm speaking....")
        super.speak(v)

        }

        override fun see(v: String) {
        println("I'm seeing....")
        super.see(v)

        }
        }

companion object

  • 伴生物件
  • 有聲明的話,物件不需宣告,在系統啟動時會自動建立
  • 從開始到結束只會有這一份物件
  • 相當於 java 的 static
  • 可把要設定為靜態的變數跟函式都放在裡面
1
2
3
4
5
6
7
8
9
class User {
companion object {
var instance = User()
}

fun printlnUser() {
}
}
User.instance.printlnUser()

if…else

  • 是 Statement(陳述句) 也是 Expression(表達式)
  • 作為表達式時,一定要有 else
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    var ifi = 20
    var ifj = 3
    //Statement
    if (ifi == 10){
    ifj = 20
    }
    else{
    ifj = 40
    }
    println("ifi = $ifi so ifj=$ifj")

    //Expression
    var if2i = 20
    var if2j = if(if2i == 20){
    60
    }else{
    70
    }

    println("if2i = $if2i so if2j=$if2j")

when

  • 是 Statement(陳述句) 也是 Expression(表達式)
  • 類似 switch … case
  • 作為表達式時,一定要有 else
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    var wi = 10;
    var wj = 0;

    when(wi){
    0 ->{
    wj = 4
    }
    10 ->{
    wj=10
    }
    else ->{
    wj = 20
    }
    }
    println("Statement when: wi = $wi so wj=$wj")

    var w2i = 10
    var w2j = when(wi){
    0 ->{
    14
    }
    10 ->{
    1
    }
    else ->{
    30
    }
    }
    println("Expression when: w2i = $w2i so w2j=$w2j")

in

  • 在 Control Flow 裡代表判斷指定項目是否存在於目標裡
  • 返回 true | false

as

  • 把變數轉成指定類型
  • 無法轉會出錯

is

  • 判斷變數類型是否與指定相似
  • 返回 true | false