在任何一門面向對象編程的語言里,類(class
)是非常基礎、但也是非常重要的一項組成,通俗的說就是萬般皆對象,而所說的對象就是我們生成的類。Kotlin
也是如此,下面詳細為大家介紹Kotlin
中的類的組成結構、函數、聲明等。
目錄
一、類的聲明
1、關鍵字
聲明類的關鍵字為
class
2、聲明格式
class Test{
// 屬性...
...
// 構造函數
...
// 函數
...
// 內部類
...
...
}
其中:
當類沒有結構體的時候,大括號可以省略。即:
class Test
二、類的構造函數
- 在
Kotlin
中,允許有一個主構造函數和多個二級構造函數(輔助構造函數)。其中主構造函數是類頭的一部分。- 關鍵字或者構造函數名:
constructor(參數)
1、主構造函數
- 主構造函數是類頭的一部分,類名的后面跟上構造函數的關鍵字以及類型參數。
1.1、舉例說明:
class Test constructor(num : Int){
...
}
等價於
/*
因為是默認的可見性修飾符且不存在任何的注釋符
故而主構造函數constructor關鍵字可以省略
*/
class Test(num: Int){
...
}
1.2、構造函數中的初始化代碼塊
- 構造函數中不能出現其他的代碼,只能包含初始化代碼。包含在初始化代碼塊中。
- 關鍵字:
init{...}
- 值得注意的是,
init{...}
中能使用構造函數中的參數
例:
fun main(args: Array<String>) {
// 類的實例化,會在下面講解到,這里只是作為例子講解打印結果
var test = Test(1)
}
class Test constructor(var num : Int){
init {
num = 5
println("num = $num")
}
}
輸出結果為:
num = 5
其中,上面的constructor
關鍵字是可以省略的。
1.3、聲明屬性的簡便方法
- 即在主構造函數中聲明。
例:
class Test(val num1 : Int, var num2 : Long, val str : String){
...
}
則:相當於聲明了3個屬性。
其中,var
表示變量(可讀寫),val
表示常量(只讀)。
1.4、什么時候constructor可以省略
- 在構造函數不具有注釋符或者默認的可見性修飾符時,
constructor
關鍵字可以省略。- 默認的可見性修飾符時
public
。可以省略不寫。請閱讀我的另一篇文章Kotlin——中級篇(三):可見性修飾符詳解
例:
// 類似下面兩種情況的,都必須存在constructor關鍵字,並且在修飾符或者注釋符后面。
class Test private constructor(num: Int){
}
class Test @Inject constructor(num: Int){
}
2、輔助(二級)構造函數
Kotlin
中支持二級構造函數。它們以constructor
關鍵字作為前綴。
2.1、聲明
例:
class Test{
constructor(參數列表){
}
}
2.2、同時存在主構造函數和二級構造函數時的情況
- 如果類具有主構造函數,則每個輔助構造函數需要通過另一個輔助構造函數直接或間接地委派給主構造函數。 使用
this
關鍵字對同一類的另一個構造函數進行委派:
例:
fun main(args: Array<String>) {
var test1 = Test(1)
var test2 = Test(1,2)
}
// 這里是為了代碼清晰,故而沒有隱藏constructor關鍵字
class Test constructor(num: Int){
init {
println("num = $num")
}
constructor(num : Int, num2: Int) : this(num) {
println(num + num2)
}
}
說明:二級構造函數中的參數1(num
),是委托了主構造函數的參數num
。
可以看出,當實例化類的時候只傳1個參數的時候,只會執行init
代碼塊中的代碼。當傳2個參數的時候,除了執行了init
代碼塊中代碼外,還執行了二級構造函數中的代碼。
輸出結果為:
num = 1
num = 1
3
2.3、當類的主構造函數都存在默認值時的情況
- 在
JVM
上,如果類主構造函數的所有參數都具有默認值,編譯器將生成一個額外的無參數構造函數,它將使用默認值。 這使得更容易使用Kotlin
與諸如Jackson
或JPA
的庫,通過無參數構造函數創建類實例。- 同理可看出,當類存在主構造函數並且有默認值時,二級構造函數也適用
例:
fun main(args: Array<String>) {
var test = Test()
var test1 = Test(1,2)
var test2 = Test(4,5,6)
}
class Test constructor(num1: Int = 10 , num2: Int = 20){
init {
println("num1 = $num1\t num2 = $num2")
}
constructor(num1 : Int = 1, num2 : Int = 2, num3 : Int = 3) : this(num1 , num2){
println("num1 = $num1\t num2 = $num2 \t num3 = $num3")
}
}
輸出結果為:
num1 = 10 num2 = 20
num1 = 1 num2 = 2
num1 = 4 num2 = 5
num1 = 4 num2 = 5 num3 = 6
說明: 當實例化無參的構造函數時。使用了參數的默認值。
三、類的實例化
- 創建一個類的實例,需要調用類的構造函數,就像它是一個常規函數一樣:
例:
var test = Test()
var test1 = Test(1,2)
其實在上面的例子中就實例化類的運用。
注意:這里和Java
不同的點是,沒有new
這個關鍵字
四、類的組成
- 類的構成由
構造函數和初始化代碼塊、屬性(字段)、函數(方法)、內部類(嵌套類)、對象聲明
五部分組成
1、構造函數和初始化代碼塊
在此篇文章已經講解,不清楚請再次熟悉下此篇文章中的構造函數模塊。
2、屬性(字段)
由於篇幅原因,請參見Kotlin——中級篇(二): 屬性與字段詳解章節。
3、函數(方法)
由於篇幅原因,請參見Kotlin——初級篇(七):函數基礎總結章節。
4、內部類(嵌套類)
由於篇幅原因,請參見Kotlin——中級篇(七):抽象類(abstract)、內部類(嵌套類)詳解章節。
5、對象聲明
由於篇幅原因,請參見對象聲明章節。
五、類的類別
Kotlin
中的類可詳細的分為:密封類、內部類(嵌套類)、抽象類、枚舉類、接口類、數據類
1、密封類
由於篇幅原因,請參見Kotlin——中級篇(六):數據類(data)、密封類(sealed)詳解章節。
2、內部類(嵌套類)
內部類
、嵌套類
已在Kotlin——中級篇(七):抽象類(abstract)、內部類(嵌套類)詳解中講解過了。
3、抽象類
由於篇幅原因,請參見Kotlin——中級篇(七):抽象類(abstract)、內部類(嵌套類)詳解章節。
4、枚舉類
由於篇幅原因,請參見Kotlin——中級篇(五):枚舉類(Enum)、接口類(Interface)詳解章節。
5、接口類
由於篇幅原因,請參見Kotlin——中級篇(五):枚舉類(Enum)、接口類(Interface)詳解章節。
6、數據類
由於篇幅原因,請參見Kotlin——中級篇(六):數據類(data)、密封類(sealed)詳解章節。
六、類的繼承
由於篇幅原因,請參見Kotlin——中級篇(四):繼承類詳解章節。
七、總結
關於類的介紹就到這里,不清楚的可以多看看文章。不過也沒太大關系,此篇文章大多數都是理論性東西。自己用Kotlin
多寫寫代碼就理解、掌握了。
如果各位大佬看了之后感覺還闊以,就請各位大佬隨便star
一下,您的關注是我最大的動力。
我的個人博客:Jetictors
我的掘金:Jetictors
Github:Jetictors