【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )
文章目錄
- I . 屬性覆蓋基本方式
- II . 屬性覆蓋的四種情況
- III . 常量 ( val ) / 變量 ( var ) 屬性覆蓋
- IV . 子類初始化時考慮覆蓋屬性的使用
I . 屬性覆蓋基本方式
1 . 屬性覆蓋 : 屬性覆蓋與方法覆蓋的方式基本相同 ;
① 屬性覆蓋前提 : 在父類中使用 open 修飾的屬性 , 可以在子類中被覆蓋 ;
② 屬性覆蓋方式 : 在子類中使用 override 修飾被覆蓋的屬性 ;
2 . 屬性覆蓋示例 :
open class Father {//被覆蓋的屬性需要使用 open 修飾open var age : Int = 60 }class Son : Father() {//子類覆蓋的屬性需要使用 override 修飾override var age : Int = 28 }II . 屬性覆蓋的四種情況
1 . 子類的覆蓋屬性的要求 : 子類中覆蓋的屬性有特定的要求 , 不能是延遲加載屬性 , 下面列舉幾種常見的方式 ;
2 . 覆蓋屬性初始化 : 子類中使用 override 覆蓋的屬性需要設(shè)定一個初始值 ;
open class Father {open var age : Int = 60 }class Son : Father() {override var age : Int = 18 }3 . 覆蓋屬性設(shè)置 getter / setter 方法 : 子類中使用 override 覆蓋的屬性設(shè)置對應(yīng)的 getter 和 setter 方法 ;
open class Father {open var age : Int = 60 }class Son : Father() {override var age : Intget() {TODO()}set(value) {} }4 . 將子類和覆蓋屬性聲明成抽象化的 : 子類可以聲明成抽象類 , 其 override 屬性也可以聲明成抽象屬性 ;
open class Father {open var age : Int = 60 }abstract class Son : Father() {abstract override var age : Int }5 . 覆蓋屬性聲明在子類主構(gòu)造函數(shù)中 : 可以將子類中覆蓋的父類屬性聲明在主構(gòu)造函數(shù)中 , 如下示例 :
open class Father {open var age : Int = 60 }class Son(override var age: Int) : Father() { }III . 常量 ( val ) / 變量 ( var ) 屬性覆蓋
1 . 常量覆蓋 : 父類中 val 修飾的常量屬性可以在子類中使用 val 或 var 覆蓋 ;
open class Father {open val name : String = "Tom"open val age : Int = 60 }class Son : Father() {//1 . 父類常量常規(guī)情況下被子類重寫成常量override val name : String = "Jerry"//2 . 父類常量可以被子類重寫成變量override var age : Int = 18 }2 . 變量覆蓋 : 父類中的 var 屬性可以被子類中的 var 屬性覆蓋 , 不能被 val 屬性覆蓋 ;
① 代碼示例 ( 正確 ) :
open class Father {open var age : Int = 60 }class Son : Father() {//父類變量 只能 被子類重寫成變量 , 不能被重寫成常量override var age : Int = 18 }② 錯誤示例 ( 錯誤 ) :
3 . 覆蓋原理 :
① 常量覆蓋 : 常量屬性只有 get 方法 , 沒有 set 方法 ; 子類將常量 override 成變量 , 就是為其多寫了一個 set 方法 ;
② 變量覆蓋 : 但是子類不能講一個變量重寫成常量 , 父類的方法可以修改添加 , 但是不能刪除 ;
IV . 子類初始化時考慮覆蓋屬性的使用
1 . 子類初始化 : 子類初始化時 , 要先將父類進行初始化 , 然后開始初始化子類 ;
2 . 父類初始化流程 :
① 父類構(gòu)造函數(shù) : 先調(diào)用主構(gòu)造函數(shù) / 次構(gòu)造函數(shù) ;
② 父類初始化 : 然后調(diào)用父類屬性構(gòu)造器 和 init 初始化代碼塊 , 這兩個模塊優(yōu)先級相同 , 根據(jù)其代碼順序從上到下執(zhí)行 ;
3 . 子類初始化流程 : 執(zhí)行完父類初始化后 , 開始執(zhí)行子類初始化 ;
① 子類構(gòu)造函數(shù) : 執(zhí)行子類構(gòu)造函數(shù)剩余部分 ( 如果有的話 , 一般是次構(gòu)造函數(shù) ) ;
② 子類初始化 : 執(zhí)行子類屬性構(gòu)造器 和 init 初始化代碼塊 代碼 , 這兩個模塊優(yōu)先級相同 , 根據(jù)其代碼順序從上到下執(zhí)行 ;
4 . 初始化過程中的覆蓋屬性 : 這里加入對覆蓋屬性的考慮 , 父類初始化過程中 , 子類覆蓋的屬性還沒有初始化 , 父類的 open 屬性可能在子類初始化過程中被修改 ;
5 . 最佳實踐 : 在父類中 , 盡量不在 構(gòu)造函數(shù) , init 初始化代碼塊 , 屬性初始化 時使用被 open 關(guān)鍵字修飾的可覆蓋屬性成員 , 因為該值不穩(wěn)定 , 會增加不確定因素 ;
總結(jié)
以上是生活随笔為你收集整理的【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】Kotlin 类的继承
- 下一篇: 【Kotlin】Kotlin 类的继承