【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
文章目錄
- I . 屬性 字段 總結(jié)
- II . 屬性聲明
- III . 屬性初始化器
- IV . get / set 屬性訪(fǎng)問(wèn)器
- V . 屬性幕后字段 field
- VI . 變量和常量的區(qū)別
- VII . 延遲初始化屬性 lateinit
I . 屬性 字段 總結(jié)
屬性與字段總結(jié) :
① 完整的屬性聲明格式如下 :
var / val <屬性名稱(chēng)>[: <屬性類(lèi)型>] [= <屬性初始化器>] [<getter 方法>] [<setter 方法>]② 屬性初始化器 : 就是為屬性賦予一個(gè)初始值 ;
③ 屬性訪(fǎng)問(wèn)器 : 即 屬性的 getter 和 setter 方法 ;
④ 屬性幕后字段 : 屬性的實(shí)際值存儲(chǔ)在 field 幕后字段中 , 只能在屬性訪(fǎng)問(wèn)器中可以使用 field 獲取該值 ;
⑤ 延遲加載屬性 : 該屬性只能是引用類(lèi)型 , 并且不能有初始化器和訪(fǎng)問(wèn)器 ;
II . 屬性聲明
1 . 屬性聲明格式 :
var / val <屬性名稱(chēng)>[: <屬性類(lèi)型>] [= <屬性初始化器>] [<getter 方法>] [<setter 方法>]① 屬性類(lèi)型 : 首先設(shè)置屬性的類(lèi)型 , 常量 val 或 變量 var ;
② 屬性名稱(chēng) : 必須制定一個(gè)屬性名稱(chēng) ;
③ 屬性類(lèi)型 : 屬性的類(lèi)型可以指定 , 也可以在賦值時(shí)自動(dòng)推斷屬性類(lèi)型 , 可選設(shè)置 ;
④ 屬性初始化器 : 給屬性一個(gè)初始值 , 可選設(shè)置 ;
⑤ get 方法 : 獲取屬性的方法 , 可選設(shè)置 ;
⑥ set 方法 : 設(shè)置屬性的方法 , 可選設(shè)置 ;
2 . 屬性聲明代碼示例 : 代碼中使用了上述所有的要素 , 除 val 常量外 ;
class Student {var age : Int = 18//每次訪(fǎng)問(wèn)屬性值時(shí) ( 獲取屬性值 ) , 都會(huì)自動(dòng)調(diào)用該 get 方法get() {println("調(diào)用 get 方法")return field}//次為屬性賦值時(shí) , 都會(huì)調(diào)用 set 方法set(value) {println("調(diào)用 set 方法")field = value} }III . 屬性初始化器
1 . 屬性初始化器概念 : 屬性賦值的操作就是屬性的初始化器 ;
2 . 屬性初始化器的代碼優(yōu)先級(jí) : 屬性的初始化器與 init{} 初始化代碼塊優(yōu)先級(jí)相同 ;
3 . 屬性初始化器執(zhí)行時(shí)機(jī) : 在主構(gòu)造函數(shù)調(diào)用后 , 會(huì)按照類(lèi)中的代碼順序從上到下執(zhí)行屬性初始化器和 init 初始化代碼中的內(nèi)容 ;
IV . get / set 屬性訪(fǎng)問(wèn)器
1 . get 方法 : 屬性定義了 get 方法 , 那么每次訪(fǎng)問(wèn)屬性值時(shí) ( 獲取屬性值 ) , 都會(huì)自動(dòng)調(diào)用該 get 方法 ;
① 訪(fǎng)問(wèn)器 : get 方法又叫作訪(fǎng)問(wèn)器 , 用于獲取屬性值 ;
② 屬性推斷 : 使用 get 方法返回值可以自動(dòng)推斷屬性類(lèi)型 , 這種情況下屬性的類(lèi)型可以省略 ;
2 . set 方法 : 屬性定義了 set 方法 , 那么每次為屬性賦值時(shí) , 都會(huì)調(diào)用 set 方法 ;
① 訪(fǎng)問(wèn)器 : set方法也叫作訪(fǎng)問(wèn)器 , 用于設(shè)置屬性值 ;
② 參數(shù) : set 方法的默認(rèn)參數(shù)是 value , 也可以設(shè)置成其它值 ;
3 . 代碼示例 : 代碼中涉及到了 幕后字段 , 下一小節(jié)有詳細(xì)說(shuō)明 ;
class Student {var age : Int = 18//每次訪(fǎng)問(wèn)屬性值時(shí) ( 獲取屬性值 ) , 都會(huì)自動(dòng)調(diào)用該 get 方法get() {println("調(diào)用 get 方法")return field}//次為屬性賦值時(shí) , 都會(huì)調(diào)用 set 方法set(value) {println("調(diào)用 set 方法")field = value} }fun main() {var student : Student = Student();//給 age 屬性賦值 , 此時(shí)會(huì)自動(dòng)調(diào)用其 set 方法student.age = 18;//獲取 age 屬性值 , 此時(shí)會(huì)自動(dòng)調(diào)用其訪(fǎng)問(wèn)器 get 方法student.age; }執(zhí)行結(jié)果 :
調(diào)用 set 方法 調(diào)用 get 方法get 和 set 方法都是屬性訪(fǎng)問(wèn)器 , 用于獲取或設(shè)置屬性值
V . 屬性幕后字段 field
1 . 屬性與字段 :
① 類(lèi)屬性本質(zhì) : 類(lèi)中定義的屬性是一系列方法和代碼塊的集合 , 如 屬性初始化器 , 屬性訪(fǎng)問(wèn)器 , 屬性聲明等 , 這不是一個(gè)字段 ;
② 沒(méi)有字段概念 : 在 Kotlin 語(yǔ)言中不能聲明字段 , 只能聲明屬性 , 聲明一個(gè)屬性 , 附帶聲明了該屬性的一系列方法和初始化代碼等 ;
③ 幕后字段引入 : 在類(lèi)中肯定是有一個(gè)字段用于存儲(chǔ)屬性的值 , 這個(gè)字段就是幕后字段 , 每個(gè)屬性都有一個(gè)默認(rèn)的幕后字段 ;
2 . 幕后字段 : 只有在 get / set 屬性訪(fǎng)問(wèn)器中才可以使用幕后字段 field , 該字段代表了本屬性的屬性值 , 類(lèi)型是屬性本身的類(lèi)型 ;
3 . 幕后字段示例解析 :
下面類(lèi)中的 get 方法中使用 field 可以獲取到 age 屬性的 Int 值 ;
在 set 方法中 , 給 field 字段設(shè)置值 , 相當(dāng)于給屬性設(shè)置了 Int 值 ;
class Student {var age : Int = 18//每次訪(fǎng)問(wèn)屬性值時(shí) ( 獲取屬性值 ) , 都會(huì)自動(dòng)調(diào)用該 get 方法get() {println("調(diào)用 get 方法")return field}//次為屬性賦值時(shí) , 都會(huì)調(diào)用 set 方法set(value) {println("調(diào)用 set 方法")field = value} }4 . 幕后字段產(chǎn)生 : 只有當(dāng)在屬性訪(fǎng)問(wèn)器中使用到了 field 字段后 , 系統(tǒng)才給提供幕后字段 ; 如果在訪(fǎng)問(wèn)器中沒(méi)有使用 field 字段 , 那么系統(tǒng)就不提供幕后字段 ;
VI . 變量和常量的區(qū)別
1 . 修飾符不同 : 變量使用 var 修飾 , 常量使用 val 修飾 ;
2 . 初始化方式不同 :
變量即可以使用 set 初始化 , 也可以使用初始化器進(jìn)行初始化 ;
常量不允許定義 set 方法 , 只能在初始化器中進(jìn)行初始化 ;
VII . 延遲初始化屬性 lateinit
1 . 修飾引用數(shù)據(jù)類(lèi)型 : lateinit 不能修飾基本數(shù)據(jù)類(lèi)型 , 只能修飾引用數(shù)據(jù)類(lèi)型 , 如下圖 , lateinit 修飾 Int 類(lèi)型 , 報(bào)錯(cuò) 'lateinit' modifier is not allowed on properties of primitive types ;
2 . 屬性不能有初始化器 : lateinit 修飾的數(shù)據(jù)類(lèi)型不能定義初始化器 , 報(bào)錯(cuò)信息 'lateinit' modifier is not allowed on properties with initializer ;
3 . 屬性不能有訪(fǎng)問(wèn)器 : lateinit 修飾的數(shù)據(jù)類(lèi)型不能定義 getter 和 setter 屬性訪(fǎng)問(wèn)器 ; 報(bào)錯(cuò) 'lateinit' modifier is not allowed on properties with a custom getter or setter ;
4 . 屬性定義位置 : 盡量定義在類(lèi)中 , 1.2 之后的 Kotlin 版本可以定義在主構(gòu)造函數(shù) 和 局部變量中 , 不過(guò)為了代碼兼容 , 還是在類(lèi)中定義延遲初始化屬性 ;
5 . 延遲初始化屬性為空 : 如果在沒(méi)有初始化屬性值時(shí) , 調(diào)用該 lateinit 延遲初始化屬性 , 會(huì)拋出異常 ;
6 . lateinit 延遲初始化屬性推薦示例 :
class Student {//在類(lèi)中定義//不要定義 屬性初始化器//不要定義 getter setter 屬性訪(fǎng)問(wèn)器lateinit var name : String }總結(jié)
以上是生活随笔為你收集整理的【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Kotlin】接口 ( 声明 | 实现
- 下一篇: 【Kotlin】扩展函数 ( 扩展函数声