日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )

發(fā)布時間:2025/6/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

        • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。