Kotlin初階(2)

Kotlin初階(2)bash

第一篇入口:Kotlin初階(2)ide

Kotlin初階易錯知識點

九、數字定義(能夠用"_"來區別很長的數字)

//使用下劃線使數字常量更易讀
    val oneMillion = 1_000_000
    val creditCardNumber = 1234_5678_9012_3456L
    val socialSecurityNumber = 999_99_9999L
    val hexBytes = 0xFF_EC_DE_5E
    val bytes = 0b11010010_01101001_10010100_10010010
複製代碼

十、for循環(極其方便)

fun forCircle() {
        for (i in 1..5 step 1) {
            print(i)
            //輸出12345
        }
        for (i in 5 downTo 1 step 1) {
            print(i)
            //輸出54321
        }
        for (i in 1..5 step 2) {
            print(i)
            //輸出13
        }
        for (i in 1 until 5 step 1) {
            print(i)
            //輸出1234,沒有5 等同於[1,5)
        }
    }
複製代碼

十一、類型替代(typealias)

typealias f = Foo//類型替代(f表明新的名詞,Foo表明須要另起名字的對象名,好比,Foo全名爲:尼古拉斯.凱奇.趙四,那麼f能夠叫作趙四,哪裏須要這麼高大上的名稱)
複製代碼

十二、is和!is

fun getStringLength(obj: Any): Int? {
        if (obj !is String) {
            return null
        }
        //此時obj已經自動轉化爲string類型
        return obj.length
    }
複製代碼

1三、lambda表達式使用之一函數

//limbda表達式
val sumLambda: (Int, Int) -> Int = { x, y -> x + y }//xy是入參,x+y是返回值
複製代碼

1四、長度可變的入參(關鍵字:vararg)

//可變長度入參
    fun sum5(vararg v: Int): Int {
        var sum = 0
        for (vt in v) {
            sum += vt
        }
        return sum
    }
複製代碼

1五、類相關(主構造函數,次構造函數,init方法,默認參數,變量的get和set方法,super父類方法,重寫父類方法,共有函數,私有函數)

class Runoob constructor(name1: String = "jack", psd1: String = "123456") {//默認參數
//主構造器中不能包含任何代碼,初始化代碼能夠放在初始化代碼段中,初始化代碼段使用 init 關鍵字做爲前綴
init {
    println("name : $name1, psd : $psd1")
//    name = ""//這裏連name常量都沒有定義,因此不可以進行賦值
}

    constructor(name: String, psd: String, addr: String) : this(name, psd) {
        this.name = name
        this.psd = psd
    }

    //次構造函數
    constructor(name: String, psd: String, age: Int) : this(name, psd) {
    }

    var nickName = name1
        get() {
            return nickName
        }

    var name: String
        get() {
            return name.toUpperCase()
        }
        set(value) {
            name = value
        }
    var psd: String = ""
        private set
        get() {
            return psd + "@"
        }
}
複製代碼

1六、interface的方法體是否實現是可選的。屬性也是抽象的,須要實現類從新賦值。

interface BaseView {
	var mNickName: String//抽象的屬性
    fun walk() {//方法體是否實現是可選的
        println("BaseView,walk!!!")
    }

    fun yeal() {}//
}
複製代碼

1七、密封類

//密封類
sealed class Expr//至關於枚舉的擴展

data class Const(val number: Double) : Expr()//這裏只有另一個double的狀態入參
data class Sum(val e1: Expr, val e2: Expr) : Expr()//這個密封類裏面就有兩個Expr的狀態入參
object NotANumber : Expr()

fun eval(expr: Expr): Double = when (expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    //由於已經覆蓋了因此的狀況,就不須要else子句了
}
複製代碼

1八、枚舉

Color.BLACK.name
    enumValues<Color>().size
    enumValues<Color>().get(0)
    enumValues<Color>().plus(Color.WHITE)
    enumValues<Color>().iterator()
    enumValueOf<Color>(Color.WHITE.toString())
複製代碼

1九、list和Comparable

fun <T : Comparable<T>> sort(list: List<T>) {
}
    sort(listOf(1, 2, 3)) // OK。Int 是 Comparable<Int> 的子類型
    // 錯誤:HashMap<Int, String> 不是 Comparable<HashMap<Int, String>> 的子類型
//    sort(listOf(HashMap<Int, String>()))
複製代碼

20、object對象

val site = object {
        var name = "jack"
        var url = "www.tansu.com"
    }
複製代碼

2一、委託類,委託對象(經過關鍵字 by 創建)

interface MyBase {
    fun bark()
//    fun bak()
}

class BaseImpl(val x: Int) : MyBase {
    fun bak() {}
    override fun bark() {
        println("x:$x")
    }
}

// 經過關鍵字 by 創建 委託類
class Deried(b: MyBase) : MyBase by b

fun test3() {
    var baseImpl = BaseImpl(10)
    Deried(baseImpl).bark()
    baseImpl.bak()
//    Deried(baseImpl).bak()//沒法訪問到非interface定義的方法
}

// 定義包含屬性委託的類
class Example {
    var p: String by Delegate()
    //說明:若是p是var的話,那麼委託類須要有getValue和setValue兩個方法(由於此時是可變的變量,須要由set方法)
    //說明:若是p是val的話,那麼委託類只須要有getValue方法便可,另一個能夠不要求(此時爲不可變常量,不須要set值進去)
}

// 委託的類
class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, 這裏委託了 ${property.name} 屬性"//這裏name爲p
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef${property.name} 屬性賦值爲 $value")//value爲設置進來的值
    }
}

fun test4() {
    val e = Example()
    println(e.p)     // 訪問該屬性,調用 getValue() 函數

    e.p = "Runoob"   // 調用 setValue() 函數
    println(e.p)
//    Example@433c675d, 這裏委託了 p 屬性
//    Example@433c675d 的 p 屬性賦值爲 Runoob
//    Example@433c675d, 這裏委託了 p 屬性
}
複製代碼

2一、監聽類值的變化

class User {
    var name: String by Delegates.observable("初始值") { prop, old, new ->
        println("舊值:$old -> 新值:$new. prop:$prop")
    }
}
    val user = User()
    user.name = "第一次賦值"
    user.name = "第二次賦值"
//    舊值:初始值 -> 新值:第一次賦值
//    舊值:第一次賦值 -> 新值:第二次賦值
複製代碼

2二、map

//把屬性儲存在映射中
class MyWebSite(val map: Map<String, Any?>) {
    val name: String by map
    val url: String  by map
}
使用
    var myWebSite = MyWebSite(mapOf("name" to "jack", "url" to "www.baidu.com"))
    myWebSite.name
    myWebSite.url
    //結果讀取出來
複製代碼

2三、其它

class Foo {
    var notNullBar: String by Delegates.notNull<String>()
}
使用
    var foo = Foo()
    foo.notNullBar = "bar"
    println(foo.notNullBar)
複製代碼

第一篇入口:Kotlin初階(2)post

相關文章
相關標籤/搜索