天天看點

【kotlin學習過程】kotlin面向對象

繼學習完kotlin的基礎知識後就是類與對象了。

  1. Kotlin 中使用關鍵字 class 聲明類

class Human(var name:String){
    fun eat(){
        println("$name 在吃飯")
    }
}
fun main(args:Array<String>){
    var man= Human("小強")
    man.eat()
}
           

2.封裝

  • 隐藏内部實作的細節
  • 隐藏内部實作的細節就是封裝
  • 封裝就是隐藏内部實作的細節

    封裝在fun函數前加個private 關鍵字就ok

3.繼承

在 Kotlin 中所有類都有一個共同的超類 Any,這對于沒有超類型聲明的類是預設超類

要聲明一個顯式的超類型,我們把類型放到類頭的冒号之後

父類必須是open的。如果父類允許子類重寫方法的話也需要在fun前面加open,子類重寫父類方法需要加override在fun前面

open class Base(p: Int){
    open fun v(){}
    fun nv(){}
}

class Derived(p: Int) : Base(p){
    override fun v(){}
    //override fun nv(){} 父類不允許子類重寫nv方法
}
           

4.抽象類和繼承

abstract class Human(var name:String){
    abstract fun eat()
}

class Man(name:String):Human(name){
    override fun eat(){
        println("男人在吃飯")
    }
}
class Woman(name:String):Human(name){
    override fun eat(){
        println("女人在吃飯")
    }
}
           

5.接口

Kotlin 的接口與 Java 8 類似,既包含抽象方法的聲明,也包含實作。與抽象類不同的是,接口無法儲存狀态。它可以有屬性但必須聲明為抽象或提供通路器實作。

使用關鍵字 interface 來定義接口

interface MyInterface {
    fun bar()
    fun foo() {
      // 可選的方法體
    }
}
class Child : MyInterface {
    override fun bar() {
        // 方法體
    }
}
           

需要了解

**接口是事物的能力

抽象類是事物的本質**

6.委托

委托模式已經證明是實作繼承的一個很好的替代方式, 而 Kotlin 可以零樣闆代碼地原生支援它。 類 Derived 可以繼承一個接口 Base,并将其所有共有的方法委托給一個指定的對象:

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
    val b = BaseImpl(10)
    Derived(b).print() // 輸出 10
}
           

Derived 的超類型清單中的 by-子句表示 b 将會在 Derived 中内部存儲。 并且編譯器将生成轉發給 b 的所有 Base 的方法。

請注意,覆寫會以你所期望的方式工作:編譯器會使用你的 override 實作取代委托對象中的實作。如果我們為 Derived 添加 override fun print() { print(“abc”) },該程式會輸出“abc”而不是“10”。

7.單例模式

把class聲名改成object就可以直接實作單例模式

8.枚舉

枚舉類的最基本的用法是實作類型安全的枚舉

enum class Week{
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
//Week.Monday
           

9.印章(密封)類

印章類就是指定個數個子類的類型,而不能有任何其他類型。

sealed class Child{
    class Son:Child()
    class Daughter:Child()
    fun too(){
        println("xxxxx")
    }
}
fun main(args: Array<String>) {
      var first:Child = Child.Son()
      var second:Child = Child.Daughter()
}