1. 程式人生 > >Kotlin程式設計之父類和繼承父類

Kotlin程式設計之父類和繼承父類

Kotlin程式設計相關知識點介紹

1. 預設繼承Any超類

在Kotlin程式設計中,Any類是超類.

public open class Any {

    public open operator fun equals(other: Any?): Boolean

    public open fun hashCode(): Int

    /**
     * 返回物件的字串形式.
     */
    public open fun toString(): String
}

通常我們宣告一個類:

class Test{//隱式繼承Any

}

有沒有感覺和Java很像呀,在Java中每個類都是預設繼承Object的哦。

2. 繼承自定義的父類

在一個原始檔中,編寫以下程式碼:

package com.xingen.kotlin

fun main(str: Array<String>) {

    var instance: BaseTest<String>
    instance = Test<String>("本類是")
    //父類物件呼叫子類物件的方法
    instance.test()

    instance.closeTest()

}

/**
 *  繼承自定義的BaseTest父類
 *  覆蓋屬性t
 *  複寫test()
 */
class Test<T> constructor(override var t: T) : BaseTest<T>(t) { /** * 複寫父類中的方法 */ override fun test() { println("${t} Test子類 ") } } /** * open關鍵字: * 1. 修飾父類:open class BaseTest * 2. 主構造方法中宣告的屬性:open val t: T * 3. 修飾方法:open fun test(){ } * * 預設情況下,Kotlin中的類,屬性,方法都是被final修飾的,不允許繼承或者覆蓋重寫。 */
open class BaseTest<T>( open val t: T) { open fun test() { println("${t} BaseTest父類 ") } fun closeTest(){ println("父類中不能被子類重新複寫的方法") } }

結果輸出:

本類是 Test子類 
父類中不能被子類重新複寫的方法

可知

  • 預設情況下,Kotlin中的類都是final標註(可省略),這意味著不允許被繼承。新增open標註才可以使父類被子類繼承。

  • 預設情況下,Kotlin中類的屬性和方法都是被final標註(可省略)的,不允許被子類重寫覆蓋。新增open標註後的屬性或者方法才能被重寫覆蓋,但是都必須新增override修飾。

  • 繼承父類:在子類的類頭後面 加上:和父類。實際上這裡有三種表現形式 :

    • 當父類無建構函式時候,表現為:父類名() ;
    • 當父類有主構造方法時候,表現形式為:父類名(傳遞的引數)
    • 當父類中只有二級建構函式時候,表現形式為:父類名;
  • 若是父類有主構造方法,子類在繼承父類時候,父類的建構函式中的引數必需立即初始化,也就是傳遞引數過去。例如:class Test<T> constructor(override var t: T) : BaseTest<T>(t)

  • 若是父類中無主構造方法,有二級構造方法,在子類繼承父類的時候,在子類的二級構造方法中呼叫super()進行初始化。

    class Test<T> : BaseTest<T>{
    
      var t :T?=null
    
      constructor(t:T)  :super(t) {
          this.t=t
      }
      /**
        * 複寫父類中的方法
        */
      override fun test() {
           println("$t Test子類 ")
           super.test()
      }
    }
    /**
    * 自定義父類
    */
    open class BaseTest<T> {
      private  var  t:T?=null
      constructor(t:T){
          this.t=t
      }
      open fun test() {
         println("$t BaseTest父類 ")
      }
     fun closeTest(){
        println("父類中不能被子類重新複寫的方法")
     }
    }