網站首頁 編程語言 正文
1.類的屬性 filed
1)在kotlin中定義屬性,必須賦初始值,要不編譯器檢查不通過。這個和java不同
2)kotlin會針對于定義的每個屬性都封裝了一個field,用于存儲數據。
3)針對于非private的var(可變)屬性,kotlin默認會生成一組getter和setter方法,通過反編生成的byteCode代碼可以看到定義的setter和getter方法。
4 )針對于非private的val(不可變)屬性,kotlin只生成了getter方法,沒有setter方法,因為定義為val的屬性,是不允許修改的。
5)我們也可以在屬性后面,復寫getter和setter方法,自己定義要實現的內容。
6)針對于private關鍵字修飾的屬性,kotlin不對外提供setter和getter方法。盡管我們能夠復寫這兩個方法。外界還是不能夠訪問。這點和Java有很大的不同。
class Person {
//針對于定義的每個屬性,都有一個filed進行封裝。
//對于非private的屬性,都會生成一對getter和setter方法
//我們也可以自己定義這倆方法
var name = ""
get() = field.plus("_01")
set(value) {
field = value.uppercase()
}
//對于val的屬性,kotlin不聽過setter方法
val age = 0
get() = field + 1
//對于private屬性,kotlin不提供getter和setter方法。
//雖然我們已經復寫了,但是外界還是不夠能訪問,這個和java的區別很大。
private var subject = ""
get() = "Kotlin"
set(value) {
field = value
}
}
fun main() {
val person = Person()
person.name = "LiLei"
println(person.name)
println(person.age)
}
2.構造函數
1)定義在class 類名 后面的構造函數,是類的主構造函數。這個和java不一樣,可以直接定義在類上
2)在主構造函數中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。如_name:String
3)在主構造函數中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。如var age:Int
4)在屬性參數后直接設置默認值。創建對象時,默認參數可以不傳。如var subject:String="Kotlin"
5通過constructor() : this可以定義次構造函數
6)通過init{}定義初始化塊,對所傳參數進行有效性檢查。初始化塊會在構造類實例時執行。
//定義在class 類名 后面的構造函數,是類的主構造函數。
//在主構造函數中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。
//也可以在主構造函數中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。
//還可以在屬性后直接設置默認值。創建對象時,默認參數可以不傳。
class Person(_name: String, var age: Int, var subject: String = "Kotlin") {
var name = _name
get() = field.plus("_01")
set(value) {
field = value.lowercase()
}
//次構造函數
constructor(_name: String, _age: Int) : this(_name, _age, "Java"){
this.name = _name.trim()
}
//無參是次構造函數
constructor() : this("", 1, "")
//初始化代碼塊
init {
//通過require函數,對屬性值做合規判斷。如果
require(age > 0) { "age must be >0" }
require(name.isNotEmpty()){"name can not be empty"}
}
}
fun main() {
val person = Person("LiLei ", 18)
println(person.name)
println(person.age)
println(person.subject)
}
3.執行順序
對應屬性,可以通過主構造函數、類屬性、初始化代碼塊、和次級構造函數,來進行初始化。
那么他們的執行順序就是上面這個順序。這個執行順序要牢記,很關鍵,有可能會踩到坑。
4.延遲初始化
通過 lateinit這個關鍵字,實現延遲初始化。屬性可以在聲明時,不必賦初始值。但是在使用前必須賦值。可以通過::hobby.isInitialized 這個來判斷是否初始化完成。
lateinit var hobby:String
fun initHobby(){
hobby="game"
}
fun isInit():Boolean{
//判斷屬性是否初始化
return ::hobby.isInitialized
}
5.惰性初始化
通過by lazy可以實現惰性初始化。屬性聲明時不必賦值,使用這個屬性時,會自動初始化。
val lazy by lazy { lazyinit() }
private fun lazyinit() :Boolean{
println("lazy init")
return true
}
原文鏈接:https://blog.csdn.net/niuyongzhi/article/details/126575708
相關推薦
- 2022-09-19 C語言中switch語句基本用法實例_C 語言
- 2022-11-24 C++?如何使用棧求解中綴、后綴表達式的值_C 語言
- 2022-05-02 python庫h5py入門詳解_python
- 2022-07-04 Python如何一行輸入多個數,并存入列表_python
- 2024-03-03 ElementUi中el-cascader表單驗證問題
- 2024-02-28 CSS,文本溢出顯示省略號
- 2022-06-07 如何在Python中妥善使用進度條詳解_python
- 2022-08-11 GoFrame基于性能測試得知grpool使用場景_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支