接口
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()