您好,登錄后才能下訂單哦!
深入淺析kotlin中的繼承與類?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
kotlin基礎(chǔ)教程之類和繼承
類聲明
使用class關(guān)鍵字聲明類,查看其聲明格式:
: modifiers ("class" | "interface") SimpleName typeParameters? primaryConstructor? (":" annotations delegationSpecifier{","})? typeConstraints (classBody? | enumClassBody)
最簡略的類聲明至少包括 modifiers class SimpleName,如:
class Empty
modifiers
包括 classModifier 和accessModifier:
classModifier: 類屬性修飾符,標(biāo)示類本身特性。 abstract //抽象類標(biāo)示 final //標(biāo)示類不可繼承,默認屬性 enum //標(biāo)示類為枚舉 open //類可繼承,類默認是final的 annotation //注解類
accessModifier: 訪問權(quán)限修飾符
private //僅在同一個文件中可見 protected //同一個文件中或子類可見 public //所有調(diào)用的地方都可見 internal //同一個模塊中可見
構(gòu)造函數(shù)聲明
可以聲明一個主構(gòu)造函數(shù)(primary constructor)和多個次級構(gòu)造函數(shù)(secondary constructor),二者都是可選的。
primary constructor聲明
作為類聲明的頭部存在,類聲明結(jié)構(gòu):
class User constructor(name:String)
當(dāng)constructor前無修飾符(如:private)時,constructor可以省略:
class User(name:String)
當(dāng)是無參構(gòu)造函數(shù)時,整個構(gòu)造函數(shù)部分也可以省略,省略的構(gòu)造函數(shù)默認是public的:
class User
primary constructor 初始化
由于primary constructor不能包含任何代碼,因此使用 init 代碼塊對其初始化,同時可以在初始化代碼塊中使用構(gòu)造函數(shù)的參數(shù):
class User(name:String){ init{ //初始化.. } }
可以類中初始化屬性:
class User(name:String){ var customName = name.toUpperCase() //初始化屬性 }
secondary constructor聲明
使用constructor前綴聲明,且必須調(diào)用primary constructor,使用this關(guān)鍵字:
class User(name:String){ /**secondary constructor**/ constructor(name:String,age:Int):this(name){ //初始化... } }
聲明構(gòu)造函數(shù)時,允許指定參數(shù)默認值,若所有參數(shù)都被指定默認值然后編譯,編譯器會生成一個額外的無參構(gòu)造函數(shù)來使用初始化屬性為初始值。
class User(name:String = “”)
作為校驗,上述聲明方式允許如下調(diào)用:
var user = User() var anotherUser = User("jason")
若構(gòu)造函數(shù)中并非所有參數(shù)都有默認值,則不會生成默認無參構(gòu)造函數(shù):
class User(name:String = "",age = Int) var user = User() //將無法編譯通過 var anotherUser = User("jason",18) //合法聲明
實例化
無需new關(guān)鍵字,即可實例化對象:
var user = User()
繼承(Inheritance)
Any
所有類都繼承該類,提供默認的三個函數(shù):
equals() hashCode() toString()
繼承聲明
在類的構(gòu)造函數(shù)之后使用 : 標(biāo)示繼承:
class Student(name:String,age:Int):User(name,age){ }
當(dāng)類未聲明構(gòu)造函數(shù)時,繼承其他類時,也不需要在primary constructor中顯示的聲明構(gòu)造函數(shù),必須在secondary constructor中顯示調(diào)用父類構(gòu)造函數(shù),若父類有多個構(gòu)造函數(shù),可選擇其一進行調(diào)用:
/**用戶基類**/ open class User(name:String){ /**secondary constructor**/ constructor(name:String,age:Int):this(name){ //初始化 } } /**子類繼承User類**/ class Student:User{ /**構(gòu)造函數(shù)**/ constructor(name:String):super(name){ } /**另外一個構(gòu)造函數(shù)**/ constructor(name:String,age:Int):super(name,age){ } }
所有類定義時默認是final屬性,不可被繼承。若需要繼承,使用open關(guān)鍵字進行修飾。
方法重載
方法默認是final的,不可被子類重載,若需要被重載,使用關(guān)鍵詞 open 進行修飾,子類重載方法使用 override 關(guān)鍵詞:
open class User{ open fun study(){} fun run(){} } class Student:User{ override fun study(){} }
override修飾的方法,默認是可以被繼承的。若希望不被繼承,可以使用 final 關(guān)鍵詞修飾。
final override fun study(){}
重載規(guī)則
當(dāng)類同時繼承類和實現(xiàn)接口,且有相同方法,且相同方法都有實現(xiàn)時,需要在重載方法中調(diào)用所繼承的方法,使用關(guān)鍵詞 super ,T表示所繼承或?qū)崿F(xiàn)的接口:
open class User{ open fun study(){} } interface Reading{ fun study(){} } class Student:User(),Reading{ override fun study(){ super<User>.study() super<Reading>.study() //與上者至少二選其一 } }
當(dāng)接口未實現(xiàn)方法時,默認為父類User的study方法,不需要調(diào)用所繼承的方法:
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() }
看完上述內(nèi)容,你們掌握深入淺析kotlin中的繼承與類的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。