kotlin基礎(chǔ)教程之類和繼承
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)示類不可繼承,默認(rèn)屬性 enum //標(biāo)示類為枚舉 open //類可繼承,類默認(rèn)是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ù)默認(rèn)是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ù)默認(rèn)值,若所有參數(shù)都被指定默認(rèn)值然后編譯,編譯器會生成一個額外的無參構(gòu)造函數(shù)來使用初始化屬性為初始值。
class User(name:String = “”)
作為校驗(yàn),上述聲明方式允許如下調(diào)用:
var user = User()
var anotherUser = User("jason")
若構(gòu)造函數(shù)中并非所有參數(shù)都有默認(rèn)值,則不會生成默認(rèn)無參構(gòu)造函數(shù):
class User(name:String = "",age = Int)
var user = User() //將無法編譯通過
var anotherUser = User("jason",18) //合法聲明
實(shí)例化
無需new關(guān)鍵字,即可實(shí)例化對象:
var user = User()
繼承(Inheritance)
Any
所有類都繼承該類,提供默認(rèn)的三個函數(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ù),可選擇其一進(jìn)行調(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){
}
}
所有類定義時默認(rèn)是final屬性,不可被繼承。若需要繼承,使用open關(guān)鍵字進(jìn)行修飾。
方法重載
方法默認(rèn)是final的,不可被子類重載,若需要被重載,使用關(guān)鍵詞 open 進(jìn)行修飾,子類重載方法使用 override 關(guān)鍵詞:
open class User{
open fun study(){}
fun run(){}
}
class Student:User{
override fun study(){}
}
override修飾的方法,默認(rèn)是可以被繼承的。若希望不被繼承,可以使用 final 關(guān)鍵詞修飾。
final override fun study(){}
重載規(guī)則
當(dāng)類同時繼承類和實(shí)現(xiàn)接口,且有相同方法,且相同方法都有實(shí)現(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)接口未實(shí)現(xiàn)方法時,默認(rè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() // 編譯錯誤
}
抽象類默認(rèn)是可被繼承的,接口是特殊的抽象類,允許有抽象方法:
interface Reading{
abstract fun reading()
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
10個Java程序員熟悉的面向?qū)ο笤O(shè)計(jì)原則
這篇文章主要為大家詳細(xì)介紹了Java程序員應(yīng)當(dāng)知道的10個面向?qū)ο笤O(shè)計(jì)原則,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
解析SpringBoot @EnableAutoConfiguration的使用
這篇文章主要介紹了解析SpringBoot @EnableAutoConfiguration的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Java實(shí)現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼
這篇文章主要介紹了如何利用Java語言自制一個偵探文字游戲—《角色扮演偵探》,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-02-02
通過Spring Boot整合Mybatis分析自動配置詳解
這篇文章主要給大家介紹了關(guān)于如何通過Spring Boot整合Mybatis分析自動配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Java如何接收并解析HL7協(xié)議數(shù)據(jù)
文章主要介紹了HL7協(xié)議及其在醫(yī)療行業(yè)中的應(yīng)用,詳細(xì)描述了如何配置環(huán)境、接收和解析數(shù)據(jù),以及與前端進(jìn)行交互的實(shí)現(xiàn)方法,文章還分享了使用7Edit工具進(jìn)行調(diào)試的經(jīng)驗(yàn),并記錄了一個常見的解析問題及其解決方法2024-12-12

