這篇文章,主要介紹kotlin中如何創(chuàng)建類,以及類的繼承等等。在介紹這個類之前。不得不介紹一下kotlin中的超類了,我們都知道java中的超類是Object,那么kotlin中的超類是什么?其實是Any,看到這個單詞我們也能聯(lián)想到就是任何的意思。應(yīng)該就是超類。但是這個超類, 它除了 equals()、hashCode()和toString()外沒有任何成員。這也跟Object有些不同。
介紹完超類后,我們開始介紹普通類。kotlin中的類關(guān)鍵字 也是 class ,所有的類如果不指明超類的話,那么它默認的超類就是Any。
類的創(chuàng)建
class people{
}
那么kotlin 中的類的構(gòu)造如何使用呢?在kotlin 中類可以有一個主構(gòu)造和多個次構(gòu)造。主構(gòu)造跟在類名后。構(gòu)造的關(guān)鍵字為constructor ,如果該構(gòu)造沒有修飾符的話。則可以省略constructor 關(guān)鍵字
class people constructor(name: String){
}
---or---
class people (name : String){
}
在kotlin中主構(gòu)造函數(shù)是不能有代碼的,所以初始化的代碼,可以放在init 關(guān)鍵字的初始化代碼塊中
class people (name: String){
init{
//=初始化代碼
}
}
需要注意的是。如果我們的類有一個主構(gòu)造函數(shù)。那么其他的次構(gòu)造函數(shù)需要調(diào)用這個主構(gòu)造函數(shù)。或者間接通過其他次構(gòu)造函數(shù)調(diào)用主構(gòu)造函數(shù),調(diào)用主構(gòu)造函數(shù)的關(guān)鍵字是this,這個可能有點繞。我下面寫個例子大家就明白了。
class people constructor(name: String){
constructor( name: String , age: Int) :this(name) {
}
constructor(name: String ,age: Int ,sex: Int) : this(name,age){
}
}
如果一個非抽象類沒有聲明任何(主或次)構(gòu)造函數(shù),它會有一個生成的不帶參數(shù)的主構(gòu)造函數(shù)。
介紹完了 類的創(chuàng)建,下面介紹下類如何創(chuàng)建實例的。和java不同的是,kotlin中創(chuàng)建類的實例。不用new 。
val peo=people(" xxx")
類的繼承
kotlin 里關(guān)于類的繼承。如我文章開始所說,超類是Any,如果沒有指定超類那么默認的超類就是Any,繼承則用: 來指定超類是誰,kotlin 中 所有的類默認都是final 的 也就是 不能繼承的,如果你創(chuàng)建的類作為超類的話,必須要用open 關(guān)鍵字表示可以公開 可以繼承。
并且子類繼承了父類,如果子類有主構(gòu)造函數(shù),那么子類需要在主構(gòu)造函數(shù)后初始化調(diào)用父類的構(gòu)造函數(shù)。類似于java
class Base (name : String)
class child (name : String) : Base(name)
若子類沒有主構(gòu)造函數(shù),那么可以在次構(gòu)造函數(shù)后 來調(diào)用父類的構(gòu)造函數(shù)。但需要使用super 關(guān)鍵字來表示
class child{
constructor(name: String) : super(name)
}
抽象類
抽象類,使用abstract 關(guān)鍵字來修飾。類和其中的某些成員可以聲明為 abstract。 抽象成員在本類中可以不用實現(xiàn)。 需要注意的是,我們并不需要用 open 標(biāo)注一個抽象類或者函數(shù),因為 抽象就是為了其他類來繼承的。
abstrat class peopel{
abstract fun f()
}
方法的覆蓋(重寫)
kotlin中子類若想重寫父類方法。那么就要將父類的方法 用open 關(guān)鍵字來修飾。否則子類是不可以與父類聲明相同方法的。除了父類要用open 關(guān)鍵字修飾。子類重寫的方法 也要用override 關(guān)鍵字來修飾。如果使用了override 關(guān)鍵字的方法默認是與open 相同就是也可以接受子類來重寫。 如果 不想子類 重寫 則在override 關(guān)鍵字前 使用final 來修飾。
class parent{
open fun sum(a: Int, b: Int){ }
}
class child :parent {
override fun sum(a: Int, b: Int){ }
---or -----
final override fun sum(a: Int ,b: Int){}
}
覆蓋的規(guī)則
kotlin 中也支持類有多個超類, 而且多個超類有相同的方法 或者成員,那么 子類必須 覆蓋 該相同的成員或方法并提供自己的實現(xiàn) ,這是由于無法區(qū)分子類到底如何處理相同的有沖突的成員或方法, 所以 為了表示采用從哪個超類型繼承的實現(xiàn),我們使用由尖括號中超類型名限定的 super,如 super<xxx>:下面舉個栗子
open class A {
open fun f() { print("A") }
}
interface B {
fun f() { print("B") } // 接口成員默認就是“open”的
}
class C() : A(), B {
// 編譯器要求覆蓋 f(): 這里可以寫子類自己的實現(xiàn)。若要調(diào)用父類的可以用super 來調(diào)用。
override fun f() {
super<A>.f() // 調(diào)用 A.f()
super<B>.f() // 調(diào)用 B.f()
}
}
以上關(guān)于 kotlin 中的類的創(chuàng)建 以及 介紹了 類的繼承 規(guī)則 包括 子類如何覆蓋 父類的方法做了介紹。下一篇將會進一步來介紹類的成員屬性等其他有關(guān)部分的使用。