【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
文章目錄
- I . 主構造函數
- II . 主構造函數聲明屬性
- III . init 初始化代碼塊
- IV . 主構造函數參數 和 成員變量訪問方式
- V . 主構造函數 可見性 設置
- VI . 次構造函數 ( 常用情況 )
- VII . 次構造函數 ( 沒有主構造函數 )
- VIII . 構造函數 代碼執行順序
- IX . 調用 主構造函數 / 次構造函數 創建類實例對象
I . 主構造函數
1 . 構造函數個數 : Kotlin 類定義時需要指定主構造函數 , 還可以指定 0 ~ 多個次構造函數 ;
2 . 主構造函數定義 : 主構造函數與類定義在一起 , 構造函數定義在類名后 , 格式為 constructor( 構造函數參數列表 ) ;
3 . 主構造函數標準定義格式 : 主構造函數與 class 類名 定義在一次 , 緊跟在類名后面 ;
class 類名 constructor( 構造函數參數 ){//類成員 }4 . 主構造函數省略 constructor 關鍵字定義格式 : 如果主構造函數 沒有 ① 可見性修飾符 或 ② 注解 , 可以省略該關鍵字 , 類名后面直接跟上構造函數的參數列表 ;
//主構造函數 : 省略了類名后的 constructor 關鍵字 class 類名 ( 構造函數參數 ){//類成員 }5 . 主構造函數定義示例 :
① 標準格式的主構造函數 :
/*標準的主構造函數*/ class Student constructor(name : String, age : Int){ }② 省略 constructor 關鍵字的主構造函數 :
/*省略 constructor 關鍵字的主構造函數省略 constructor 前提 :① 主構造函數沒有可見性修飾符 , 如 private , public , protected , internal② 主構造函數沒有注解*/ class Student (name : String, age : Int){ }II . 主構造函數聲明屬性
在類中聲明屬性可以在類中使用 var / val 屬性名稱 : 屬性類型 聲明屬性 , 也可以在主構造函數中聲明屬性 ;
① 正常的主構造函數 : 構造函數是普通的構造函數 , 類屬性字段在類體中定義 ;
/*主構造函數中不聲明屬性 ; */ class Student constructor(name : String, age : Int){var name : String = namevar age : Int = age }② 主構造函數中聲明屬性 : 在主構造函數中 , 可以直接聲明類中的屬性 , 下面的代碼 與 上面的代碼是等價的 ;
/*主構造函數中不聲明屬性 ; */ class Student constructor(var name : String, var age : Int){ }III . init 初始化代碼塊
1 . init 代碼塊引入 : 主構造函數沒有函數體 , 不能執行任何代碼 ; 主構造函數的初始化相關操作可以放在 init 初始化代碼塊中 ;
2 . init 初始化代碼塊 : 一個類中可以定義多個 init 代碼塊 , 其執行順序是按照代碼順序從上到下執行 ;
3 . 代碼執行順序 : init 初始化代碼塊 , 與類的屬性定義優先級相同 , 在類對象實例初始化時 , 會按照在類中定義的順序 , 依次執行類屬性初始化和 init 初始化代碼塊 ;
4 . 代碼執行順序示例 : 類對象初始化時 , 代碼執行順序是 : 代碼 ① -> 代碼 ② -> 代碼 ③ -> 代碼 ④
class Student constructor(name : String, age : Int){//代碼 ① init {println("主構造函數參數 : name : ${name} , age : ${age} ;")}//代碼 ② : 等號右邊的 name 是構造函數參數值var name : String = name + " L"//代碼 ③ : 等號右邊的 age 是構造函數參數值var age : Int = age + 1//代碼 ④ init {println("成員變量 : name : ${this.name} , age : ${this.age} ; 主構造函數參數 name : ${name} , age : ${age} ;")} }IV . 主構造函數參數 和 成員變量訪問方式
1 . 主構造函數參數訪問性 : 可以在 類屬性字段初始化賦值 和 init 初始化代碼塊中 訪問主構造函數中的參數變量值 ;
2 . 兩種變量的訪問方式 : 如果構造函數 與 成員變量重名 , 使用 this.變量名 訪問的是成員變量 , 使用 變量名 訪問的是 構造函數參數變量 ;
3 . 構造函數參數 與 成員變量訪問 示例代碼及解析 :
① 構造函數參數訪問 : 使用 name 和 age , 訪問的是構造函數的參數 , 不能訪問成員變量 ;
② 成員變量訪問 : 使用 this.name 和 this.age 才能訪問對象的成員變量 ;
class Student constructor(name : String, age : Int){init {println("主構造函數參數 : name : ${name} , age : ${age} ;")}//等號右邊的 name 是構造函數參數值var name : String = name + " L"//等號右邊的 age 是構造函數參數值var age : Int = age + 1init {println("成員變量 : name : ${this.name} , age : ${this.age} ; 主構造函數參數 name : ${name} , age : ${age} ;")} }fun main() {var student : Student = Student("Tom" , 18) }
執行結果 :
主構造函數參數 : name : Tom , age : 18 ; 成員變量 : name : Tom L , age : 19 ; 主構造函數參數 name : Tom , age : 18 ;V . 主構造函數 可見性 設置
1 . 構造函數可見性 : 主構造函數默認是 public 可見性 , 如果將該構造函數設置成 private , 那么 constructor 關鍵字必須要有 ;
class 類名 private constructor( 構造函數參數 ){//類成員 }2 . 可見性修飾符 :
① private : 類內部可見 , 所有其它類不可見 , 包括子類 ;
② protected : 本類 和 子類可見 , 其它類不可見 ;
③ internal : 本模塊內 可見 ;
④ public : 所有類都可見 ;
VI . 次構造函數 ( 常用情況 )
1 . 次構造函數格式 :
constructor ( 構造函數參數列表 ) : this ( 主構造函數參數列表 ){//次構造函數體 }2 . 次構造函數委托主 :
① 委托方式 : 使用 : this ( 被委托的構造函數參數列表 ) 方式 , 直接或間接委托給主構造函數 ;
② 直接委托 : 每個次構造函數必須委托給主構造函數 ( 直接委托主構造函數 ) ,
③ 間接委托 : 委托給其它次構造函數 ( 間接委托主構造函數 ) ;
VII . 次構造函數 ( 沒有主構造函數 )
如果類沒有主構造函數 , 那么可以直接聲明 次構造函數 , 不同委托給主構造函數 ;
class Person {constructor ( 次構造函數參數列表 ) {//次構造函數體} }VIII . 構造函數 代碼執行順序
1 . 代碼執行順序 : 先執行主構造函數 , 此時會初始化成員屬性 與 執行 init 初始化代碼塊 , 然后執行次構造函數內容 ;
2 . 初始化代碼塊 : init 代碼塊等同于主構造函數的函數體 , 當次構造函數將操作委托給主構造函數時 , 會先執行 init 初始化代碼塊 , 然后再運行次構造函數體 ;
IX . 調用 主構造函數 / 次構造函數 創建類實例對象
1 . 創建實例對象 : Kotlin 中沒有 new 關鍵字 , 使用 類名 ( 構造函數參數列表 ) 方式 , 創建類對象實例 ;
2 . 示例代碼 :
package construct/*標準的主構造函數*/ class Student constructor(name : String, age : Int){init {println("主構造函數參數 : name : ${name} , age : ${age} ;")}//等號右邊的 name 是構造函數參數值var name : String = name + " L"//等號右邊的 age 是構造函數參數值var age : Int = age + 1init {println("成員變量 : name : ${this.name} , age : ${this.age} ; 主構造函數參數 name : ${name} , age : ${age} ;")}//身高成員變量var height : Int = 0;constructor(name : String, age : Int, height : Int) : this(name, age){this.height = height}override fun toString(): String {return "Student(name='$name', age=$age, height=$height)"}}/*省略 constructor 關鍵字的主構造函數省略 constructor 前提 :① 主構造函數沒有可見性修飾符 , 如 private , public , protected , internal② 主構造函數沒有注解*/ class Student1 (name : String, age : Int){ }fun main() {//調用主構造函數var student : Student = Student("Tom" , 18)println(student)//調用次構造函數var student2 = Student("Jerry", 18, 165)println(student2)}3 . 執行結果 :
主構造函數參數 : name : Tom , age : 18 ; 成員變量 : name : Tom L , age : 19 ; 主構造函數參數 name : Tom , age : 18 ; Student(name='Tom L', age=19, height=0) 主構造函數參數 : name : Jerry , age : 18 ; 成員變量 : name : Jerry L , age : 19 ; 主構造函數參數 name : Jerry , age : 18 ; Student(name='Jerry L', age=19, height=165)總結
以上是生活随笔為你收集整理的【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】Kotlin 领域特定语
- 下一篇: 【Kotlin】Kotlin 类的继承