在任何一門物件導向程式設計的語言裡,類(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
Github:Jetictors