1. 程式人生 > >Kotlin 入門基礎語法學習筆記

Kotlin 入門基礎語法學習筆記

敲了一天的kotlin基礎語法,整理歸納到一個類裡面,便於以後忘記的時候複習。

/**
 * Created by GG on 2017/11/20.
 */
//main函式
fun main(args: Array<String>) {
    var testMain = TestMain()
    print(testMain.array())
}

class TestMain {
    //單例的寫法
    companion object {
        @Volatile var instance: TestMain? = null
            get() {
                if (field == null) {
                    synchronized(TestMain::class.java) {
                        if (field == null)
                            field = TestMain()
                    }
                }
                return field
            }
    }


    //變數定義
    var name: String = ""
    //常量陣列int[][][] arrs = new int[3][2][1];
    val arrs = Array(3) { Array(2) { IntArray(1) } }

    val list = arrayListOf(String)//arrayListOf("a","b")

    //返回一個String
    fun testFun(name: String) {
        this.name = name
        println(this.name)
    }

    //加法函式,普通寫法
    fun add(a: Int, b: Int): Int {
        return a + b
    }

    //加法函式表示式寫法(public 方法必須寫出返回型別)
    fun add2(a: Int, b: Int): Int = a + b

    //無返回值函式
    fun noBack(msg: String, num: Int) {
        print(msg + num)
    }

    //可變長度引數函式
    fun extend(vararg v: Int) {
        for (tempV in v) {
            print(tempV)
        }
    }

    //lambda函式 **
    fun testLambda() {
        val sumLambda: (Int, Int) -> Int = { x, y -> x + y }
    }

    //字串模板 $ 的用法
    fun testString() {
        var a = 1
        var s1 = "a is $a" //a is 1
        println(s1)
        a = 2
        var s2 = "${s1.replace("is", "was")}"  //a was 1
        println(s2)
    }

    //陣列
    fun array() {
        //陣列的兩種寫法
        var arrays = arrayOf(1, 2, 3)
        var arraysb = Array(3, { i -> (i * 2) })
        arraysb[1] = 111
        println(arraysb.toList().toString())
    }

    fun str() {
        val text = ""
    }

    //NULL 檢查機制  跑出異常加!!   允許為空加?
    fun testNull() {
        var age: String? = null  //型別後面加?表示可為空
        var age1 = age!!.toInt()   //跑出空指標異常
        var age2 = age?.toInt() //不對空null 做處理
        var age3 = age?.toInt() ?: -1 //如果為空返回- 1
        //  print(age3)
    }

    //比較
    fun compare() {
        var a: Int = 5222
        println(a === a)    //物件地址相等,值相等
        val box1: Int = a
        val box2: Int? = a
        //這裡遇到了一個問題,如果 ?=是可以正常裝箱的,但是 = 會導致box1和box2的物件地址一直相等
        //說明只有 ?=才會正常裝箱,而 = 則是直接賦值
        //還要注意的是-127-128在JVM中是快取的,所以無論是否裝箱都會相等,指向相同的記憶體地址
        println(box1 == box2)
        println(box1 === box2)
        println(a === box1)
        println(a === box2)

        println(a.javaClass)
    }

    //型別檢查和自動轉型   (Int? 表示為如果返回值不是Int,會返回空)
    fun getStringLenght(obj: Any): Int? {
        if (obj is String) {
            // 做過型別判斷以後,obj會被系統自動轉換為String型別
            return obj.length
        }

        //在這個分支中
        if (obj !is Int) {
            return null
        }
        //這裡被轉為了Int型
        return obj

        //甚至可以在同一個表示式中進行轉換,這裡可以看到obj.length == 2中obj已經成為String型別
        if (obj is String && obj.length == 2) {
            return obj.length
        }

        //這裡的obj仍然是Any型別
        return null
    }

    //區間演算法
    fun interval() {
        //輸出1234
        for (i in 1..4) print(i)
        //什麼都不輸出
        for (i in 4..1) print(i)

        //等同於 1 <= i && i <= 10
        var i: Int = 2
        if (i in 1..10) {
            println(i)
        }

        //使用step指定步長
        for (i in 1..4 step 2) println(i) //輸出13

        for (i in 4 downTo 1 step 2) println(i) //輸出42

        //使用utils 函式排除結束元素
        for (i in 1 until 10) print(i)
    }


}