在任何一門面向對象編程的語言裏,類(class
)是很是基礎、但也是很是重要的一項組成,通俗的說就是萬般皆對象,而所說的對象就是咱們生成的類。Kotlin
也是如此,下面詳細爲你們介紹Kotlin
中的類的組成結構、函數、聲明等。html
一、關鍵字git
聲明類的關鍵字爲
class
github
二、聲明格式編程
class Test{ // 屬性... ... // 構造函數 ... // 函數 ... // 內部類 ... ... }
其中:函數
當類沒有結構體的時候,大括號能夠省略。即:this
class Test
- 在
Kotlin
中,容許有一個主構造函數和多個二級構造函數(輔助構造函數)。其中主構造函數是類頭的一部分。- 關鍵字或者構造函數名:
constructor(參數)
一、主構造函數3d
- 主構造函數是類頭的一部分,類名的後面跟上構造函數的關鍵字以及類型參數。
1.一、舉例說明:code
class Test constructor(num : Int){ ... }
等價於htm
/* 由於是默認的可見性修飾符且不存在任何的註釋符 故而主構造函數constructor關鍵字能夠省略 */ class Test(num: Int){ ... }
1.二、構造函數中的初始化代碼塊對象
- 構造函數中不能出現其餘的代碼,只能包含初始化代碼。包含在初始化代碼塊中。
- 關鍵字:
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.三、聲明屬性的簡便方法
- 即在主構造函數中聲明。
例:
class Test(val num1 : Int, var num2 : Long, val str : String){ ... }
則:至關於聲明瞭3個屬性。
其中,var
表示變量(可讀寫),val
表示常量(只讀)。
1.四、何時constructor能夠省略
- 在構造函數不具備註釋符或者默認的可見性修飾符時,
constructor
關鍵字能夠省略。- 默認的可見性修飾符時
public
。能夠省略不寫。請閱讀個人另外一篇文章Kotlin——中級篇(三):可見性修飾符詳解
例:
// 相似下面兩種狀況的,都必須存在constructor關鍵字,而且在修飾符或者註釋符後面。 class Test private constructor(num: Int){ } class Test @Inject constructor(num: Int){ }
二、輔助(二級)構造函數
Kotlin
中支持二級構造函數。它們以constructor
關鍵字做爲前綴。
2.一、聲明
例:
class Test{ constructor(參數列表){ } }
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.三、當類的主構造函數都存在默認值時的狀況
- 在
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
這個關鍵字
- 類的構成由
構造函數和初始化代碼塊、屬性(字段)、函數(方法)、內部類(嵌套類)、對象聲明
五部分組成
一、構造函數和初始化代碼塊
在此篇文章已經講解,不清楚請再次熟悉下此篇文章中的構造函數模塊。
二、屬性(字段)
因爲篇幅緣由,請參見Kotlin——中級篇(二): 屬性與字段詳解章節。
三、函數(方法)
因爲篇幅緣由,請參見Kotlin——初級篇(七):函數基礎總結章節。
四、內部類(嵌套類)
因爲篇幅緣由,請參見Kotlin——中級篇(七):抽象類(abstract)、內部類(嵌套類)詳解章節。
五、對象聲明
因爲篇幅緣由,請參見對象聲明章節。
Kotlin
中的類可詳細的分爲:密封類、內部類(嵌套類)、抽象類、枚舉類、接口類、數據類
一、密封類
因爲篇幅緣由,請參見Kotlin——中級篇(六):數據類(data)、密封類(sealed)詳解章節。
二、內部類(嵌套類)
內部類
、嵌套類
已在Kotlin——中級篇(七):抽象類(abstract)、內部類(嵌套類)詳解中講解過了。
三、抽象類
因爲篇幅緣由,請參見Kotlin——中級篇(七):抽象類(abstract)、內部類(嵌套類)詳解章節。
四、枚舉類
因爲篇幅緣由,請參見Kotlin——中級篇(五):枚舉類(Enum)、接口類(Interface)詳解章節。
五、接口類
因爲篇幅緣由,請參見Kotlin——中級篇(五):枚舉類(Enum)、接口類(Interface)詳解章節。
六、數據類
因爲篇幅緣由,請參見Kotlin——中級篇(六):數據類(data)、密封類(sealed)詳解章節。
因爲篇幅緣由,請參見Kotlin——中級篇(四):繼承類詳解章節。
關於類的介紹就到這裏,不清楚的能夠多看看文章。不過也沒太大關係,此篇文章大多數都是理論性東西。本身用Kotlin
多寫寫代碼就理解、掌握了。
若是各位大佬看了以後感受還闊以,就請各位大佬隨便star
一下,您的關注是我最大的動力。
個人我的博客:Jetictors
個人掘金:Jetictors
Github:Jetictors