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