1. 程式人生 > >kotlin的 類,繼承,過載,抽象類,建構函式

kotlin的 類,繼承,過載,抽象類,建構函式

主要內容

  • 類宣告
  • 建構函式宣告
  • 例項化
  • 繼承
  • 方法過載
  • 抽象類

一、類宣告

使用class關鍵字宣告類,檢視其宣告格式:

: modifiers ("class" | "interface") SimpleName
  typeParameters?
  primaryConstructor?
  (":" annotations delegationSpecifier{","})?
  typeConstraints
  (classBody? | enumClassBody)

最簡略的類宣告至少包括 modifiers class SimpleName,如:

class Empty
modifiers

包括 classModifier 和_accessModifier_:

  • classModifier: 類屬性修飾符,標示類本身特性。

      abstract //抽象類標示  
      final  //標示類不可繼承,預設屬性
      enum  //標示類為列舉
      open  //類可繼承,類預設是final的
      annotation  //註解類
  • accessModifier: 訪問許可權修飾符

      private //僅在同一個檔案中可見
      protected //同一個檔案中或子類可見
      public //所有呼叫的地方都可見
      internal //同一個模組中可見

二、建構函式宣告

可以宣告一個主建構函式(primary constructor)

和多個次級建構函式(secondary constructor),二者都是可選的。

primary constructor宣告

作為類宣告的頭部存在,類宣告結構:

class User constructor(name:String)

當constructor前無修飾符(如:private)時,constructor可以省略:

class User(name:String)

當是無參建構函式時,整個建構函式部分也可以省略,省略的建構函式預設是public的:

class User

primary constructor 初始化

由於primary constructor不能包含任何程式碼,因此使用 init

 程式碼塊對其初始化,同時可以在初始化程式碼塊中使用建構函式的引數:

class User(name:String){
    init{
        //初始化..    
    }
}

可以類中初始化屬性:

class User(name:String){
    var customName = name.toUpperCase() //初始化屬性
}

secondary constructor宣告

使用constructor字首宣告,且必須呼叫primary constructor,使用this關鍵字:

class User(name:String){

    /**secondary constructor**/
    constructor(name:String,age:Int):this(name){
        //初始化...
    }
}

宣告建構函式時,允許指定引數預設值,若所有引數都被指定預設值然後編譯,編譯器會生成一個額外的無參建構函式來使用初始化屬性為初始值。

class User(name:String = "")

作為校驗,上述宣告方式允許如下呼叫:

var user = User()

var anotherUser = User("jason")

若建構函式中並非所有引數都有預設值,則不會生成預設無參建構函式:

class User(name:String = "",age = Int)

var user = User() //將無法編譯通過 

var anotherUser = User("jason",18) //合法宣告

三、例項化

無需new關鍵字,即可例項化物件:

var user = User()

四、繼承(Inheritance)

Any

所有類都繼承該類,提供預設的三個函式:

equals()

hashCode()

toString()

繼承宣告

在類的建構函式之後使用 : 標示繼承:

class Student(name:String,age:Int):User(name,age){

}

當類未宣告建構函式時,繼承其他類時,也不需要在primary constructor中顯示的宣告建構函式,必須在secondary constructor中顯示呼叫父類建構函式,若父類有多個建構函式,可選擇其一進行呼叫:

/**使用者基類**/
open class User(name:String){

    /**secondary constructor**/
    constructor(name:String,age:Int):this(name){
        //初始化
    }
}

/**子類繼承User類**/
class Student:User{

    /**建構函式**/
    constructor(name:String):super(name){

    }

    /**另外一個建構函式**/
    constructor(name:String,age:Int):super(name,age){

    }
}

所有類定義時預設是final屬性,不可被繼承。若需要繼承,使用open關鍵字進行修飾。

方法過載

方法預設是final的,不可被子類過載,若需要被過載,使用關鍵詞 open 進行修飾,子類過載方法使用 override 關鍵詞:

open class User{

    open fun study(){}

    fun run(){}
}

class Student:User{
    override fun study(){}
}

override修飾的方法,預設是可以被繼承的。若希望不被繼承,可以使用 final 關鍵詞修飾。

final override fun study(){}

過載規則

當類同時繼承類和實現介面,且有相同方法,且相同方法都有實現時,需要在過載方法中呼叫所繼承的方法,使用關鍵詞 super<T> ,T表示所繼承或實現的介面:

open class User{
    open fun study(){}
}

interface Reading{
    fun study(){}
}

class Student:User(),Reading{
    override fun study(){
        super<User>.study() 
        super<Reading>.study() //與上者至少二選其一
    }
}

當介面未實現方法時,預設為父類User的study方法,不需要呼叫所繼承的方法:

interface Reading{
    fun study()
}

class Student:User(),Reading{
    override fun study(){
        //do nothing
    }
}

抽象類

Kotlin中的抽象類允許有abstract修飾的成員方法,非抽象類不允許有抽象方法;

abstract class User{
    abstract fun study()
}

class Person{
    abstract fun study() // 編譯錯誤
}

抽象類預設是可被繼承的,介面是特殊的抽象類,允許有抽象方法:

interface Reading{
    abstract fun reading()
}