天天看點

【Kotlin 學習筆記】kotlin的類、對象和接口基礎

接口

kotlin中的接口與java8相似,可以包含抽象方法的定義以及非抽象方法的實作,但是不能包含任何狀态。kotlin中使用interface關鍵字而不是class來聲明。

聲明簡單接口

interface Clickable{
    fun click()
}
           

所有實作這個接口的非抽象類都需要提供這個方法的一個實作。

實作該簡單接口

class Button : Clickable{
    override fun click() = println("I was clicked")
}
           

Kotlin在類名後使用:代替extends和implements關鍵字。和java一樣,一個類可以實作多個接口但是隻能繼承一個類。在Kotlin中,override修飾符用來标注被重寫的父類或者接口的方法和屬性。與java不同的是,在kotlin中使用override修飾符是強制要求的。

接口的方法可以有一個預設實作,并且不需要标注default關鍵字。在上述接口中,添加一個帶方法體的方法。

interface Clickable{
    fun click()
    fun showOff() = println("I'm clickable!")
}
           

使用某個類實作這個接口時,必須提供click方法的實作,可以重新定義showOff方法的實作也可以不更改直接調用。

  • open、final和abstract修飾符:預設為final

java允許建立任何類的子類并重寫任何方法(除了顯示的final關鍵字)而kotlin中則預設使用final,不加修飾符就不能被重寫。

kotlin中需要使用open修飾符來顯式的表示該類可建立子類。也可以用open修飾符來修飾可以被重寫的方法和屬性。

//該類可以被繼承
open class Button : Clickable{
    fun disable(){}   //該函數不可在子類中被重寫
    open fun animate() {} //該函數可以在子類中重寫
    override fun click() {} 
//該函數重寫了一個open函數,并且它本身同樣是open的。也就是該函數仍可在子類中被重寫。
}
           

abstract修飾符是同java一樣都是修飾抽象類的。抽象類中包含一些沒有實作并且必須在子類重寫的抽象成員,抽象成員始終是open的,是以不需要顯式地使用open修飾符。抽象成員是不可以在抽象類中有具體實作的。

abstract class Animated{
    abstract fun animate() //該函數必須被子類重寫
    open fun stopAnimating() {} //抽象類中的非抽象函數并不是預設open的,但是可以标注為open
    fun animateTwice(){}
}
           
  • 可見性修飾符:預設public
修飾符 類成員 頂層聲明
public  所有地方可見 所有地方可見
internal 子產品中可見 子產品中可見
protected 子類中可見 -
private 類中可見 檔案中可見

internal可見性的優勢在于它是提供了對子產品實作細節的真正封裝。

protected修飾符在java和kotlin中不同的行為,java中可以允許同一個包的類通路protected成員 但在kotlin中 隻有類和它的子類成員才可以通路protected函數。類的擴充函數也不能通路它的private和protected成員。

  • 構造類(類的構造函數)
class User(val nickname:String)
           

val意味着相應的屬性會用構造方法的參數來初始化。在kotlin中,如果一個類未指定構造函數。那麼在建立該類時,需要顯式的調用該類的主構造方法。即在類名稱後加()。

類中可以使用constructor來聲明從構造方法。

open class View{
    constructor(ctx:Context){  //從構造方法,該函數未聲明主構造方法。(沒有括号)
}
}
           

對象

  • "object"關鍵字

kotlin中使用object聲明對象。一個對象聲明在定義的時候就立即建立了,不需要在其他地方調用構造方法。是以在對象聲明中不允許存在構造方法。對象聲明可以繼承自類和接口。

object roll{
    fun caculateSalary(){
}
}
           

與變量一樣,對象聲明是允許你用對象名和.字元來調用的。調用時代碼如下:

roll.calculateSalary()