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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

發(fā)布時(shí)間:2025/6/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 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)題。

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