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