【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
文章目錄
- I . 擴展屬性 總結
- II . 擴展屬性 定義格式
- III . 擴展屬性 標準示例
- IV . 擴展屬性 注意事項
- V . 擴展屬性 本質分析
- VI . 擴展屬性 代碼示例解析
I . 擴展屬性 總結
擴展屬性 總結 :
① 修飾 : 變量擴展屬性使用 var 修飾 , 常量擴展屬性使用 val 修飾 ;
② 屬性訪問器定義 : 變量屬性必須定義 get 和 set 屬性訪問器方法 , 常量屬性必須定義 get 屬性訪問器方法 ;
③ 注意事項 : 擴展屬性沒有幕后字段 , 沒有初始化器 , 必須定義屬性訪問器 ;
④ 擴展屬性本質 : 擴展屬性沒有在內存中分配字段保存該屬性 , 其本質是一個經過計算得出的值 , 擴展變量屬性相當于擴展了兩個屬性訪問器方法 ;
II . 擴展屬性 定義格式
1 . 擴展變量屬性定義格式 : 擴展的變量屬性 , 使用 var 修飾屬性 , 必須定義 get / set 屬性訪問器方法 ;
var 接收者類型.擴展屬性名稱 : 擴展屬性類型get(){}set(value){}2 . 擴展常量屬性定義格式 : 擴展的變量屬性 , 使用 val 修飾 , 必須定義 get 方法 , 必須不能定義 set 方法 ;
val 接收者類型.擴展屬性名稱 : 擴展屬性類型get(){}III . 擴展屬性 標準示例
擴展屬性要素 :
1 . 修飾符 : 使用 var 修飾擴展的變量屬性 , 使用 val 修飾擴展的常量屬性 ;
2 . 屬性訪問器定義 : 變量必須定義 getter 和 setter 屬性訪問器 , 常量擴展屬性只能且必須定義 getter 方法 ;
open class Student {var name : String = "Tom"var age : Int = 18 }//擴展變量屬性 Student.olderAge : Intget() {return this.age + 1}set(value) {this.age = value - 1}//擴展常量屬性 val Student.nameAndage : Stringget() {return "${this.name} : ${this.age}"}IV . 擴展屬性 注意事項
1 . 沒有幕后字段 : 不管是擴展函數 , 還是擴展屬性 , 都沒有將擴展的成員加入到類中 , 擴展屬性沒有 幕后字段 ;
2 . 不能有屬性初始化器 : 擴展屬性由于沒有幕后字段 , 因此不能定義屬性的初始化器 , 給擴展屬性定義初始化器有如下報錯信息 Extension property cannot be initialized because it has no backing field ;
3 . 擴展屬性初始化問題 : 擴展屬性沒有初始化器 , 那么就必須處理初始化問題 , 必須定義其 get / set 訪問器方法 ;
4. 擴展屬性不能保存值 : 擴展屬性沒有幕后字段不能保存實際的字段值 , 其屬性訪問器中只能調用對象中的屬性和方法 , 不能調用擴展屬性本身 , 會棧溢出 ;
V . 擴展屬性 本質分析
1 . 沒有實際字段字段 : 擴展屬性并不是一個實際的屬性 , 沒有幕后字段 , 不能存儲一個新的字段值 ;
2 . 擴展屬性可訪問內容 : 擴展屬性的屬性訪問器中只能調用接收者類型對象中的其它成員 , 不能調用擴展屬性本身 ;
3 . 本質是擴展函數 : 擴展屬性本質相當于定義了屬性訪問器方法 , 在該方法中可以對擴展的接收者類對象進行各種操作 , 其本質是擴展了兩個函數 ( get / set 屬性訪問器 ) ;
VI . 擴展屬性 代碼示例解析
擴展屬性代碼示例解析 :
1 . olderAge 擴展屬性 : 該屬性是 var 修飾的擴展的變量屬性 , 必須定義該屬性的 get 和 set 屬性訪問器 ;
2 . olderAge 擴展屬性的本質 :
① 沒有為 olderAge 屬性分配內存 : 在內存中是沒有準備任何字段來存儲這個值的 , 因此實際上在內存中是沒有為該值分配內存空間 ;
② 屬性訪問器可訪問內容 : 只能通過調用 Student 接收者類型對象中的成員屬性 , 成員方法 , 或定義局部變量 ;
③ 擴展屬性本質 : 使用上述可訪問內容 , 經過計算模擬生成一個屬性 , 這里模擬的屬性就是比 Student 對象的 age 大一歲的 年齡屬性 ;
3 . nameAndage 擴展屬性 : 是一個常量 , 使用 val 修飾 , 因此其只能定義 get 屬性訪問方法 , 其本質與上面的變量本質相同 , 內存中沒有實際值 , 是一個經過運算生成的值 ;
4 . 擴展屬性 代碼示例 :
open class Student {var name : String = "Tom"var age : Int = 18 }/*擴展屬性并不是添加了一個屬性沒有額外擴展一個存儲任何值的字段可以利用原來的類模擬生成一個字段本質是 : 為該接收者類擴展了兩個方法該擴展的屬性意義是 , 定義了一個屬性 , 比類中的年齡大一歲*/ var Student.olderAge : Intget() {//擴展屬性的訪問器中 , 可以訪問任何接收者類對象中的屬性和方法// 絕對不能訪問該屬性本身 , 會造成遞歸溢出return this.age + 1}set(value) {this.age = value - 1}//擴展常量屬性 val Student.nameAndage : Stringget() {return "${this.name} : ${this.age}"}fun main() {var student : Student = Student()student.olderAge = 18//18println(student.olderAge)//Tom : 17println(student.nameAndage) }5 . 執行結果 :
18 Tom : 17總結
以上是生活随笔為你收集整理的【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】扩展函数 ( 扩展函数声
- 下一篇: 【Kotlin】扩展函数作用域分析 (