Kotlin類與屬性及構(gòu)造函數(shù)的使用詳解
1.類的屬性 filed
1)在kotlin中定義屬性,必須賦初始值,要不編譯器檢查不通過。這個和java不同
2)kotlin會針對于定義的每個屬性都封裝了一個field,用于存儲數(shù)據(jù)。
3)針對于非private的var(可變)屬性,kotlin默認(rèn)會生成一組getter和setter方法,通過反編生成的byteCode代碼可以看到定義的setter和getter方法。
4 )針對于非private的val(不可變)屬性,kotlin只生成了getter方法,沒有setter方法,因為定義為val的屬性,是不允許修改的。
5)我們也可以在屬性后面,復(fù)寫getter和setter方法,自己定義要實現(xiàn)的內(nèi)容。
6)針對于private關(guān)鍵字修飾的屬性,kotlin不對外提供setter和getter方法。盡管我們能夠復(fù)寫這兩個方法。外界還是不能夠訪問。這點(diǎn)和Java有很大的不同。
class Person { //針對于定義的每個屬性,都有一個filed進(jìn)行封裝。 //對于非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方法。 //雖然我們已經(jīng)復(fù)寫了,但是外界還是不夠能訪問,這個和java的區(qū)別很大。 private var subject = "" get() = "Kotlin" set(value) { field = value } } fun main() { val person = Person() person.name = "LiLei" println(person.name) println(person.age) }
2.構(gòu)造函數(shù)
1)定義在class 類名 后面的構(gòu)造函數(shù),是類的主構(gòu)造函數(shù)。這個和java不一樣,可以直接定義在類上
2)在主構(gòu)造函數(shù)中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。如_name:String
3)在主構(gòu)造函數(shù)中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。如var age:Int
4)在屬性參數(shù)后直接設(shè)置默認(rèn)值。創(chuàng)建對象時,默認(rèn)參數(shù)可以不傳。如var subject:String="Kotlin"
5通過constructor() : this可以定義次構(gòu)造函數(shù)
6)通過init{}定義初始化塊,對所傳參數(shù)進(jìn)行有效性檢查。初始化塊會在構(gòu)造類實例時執(zhí)行。
//定義在class 類名 后面的構(gòu)造函數(shù),是類的主構(gòu)造函數(shù)。 //在主構(gòu)造函數(shù)中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。 //也可以在主構(gòu)造函數(shù)中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。 //還可以在屬性后直接設(shè)置默認(rèn)值。創(chuàng)建對象時,默認(rèn)參數(shù)可以不傳。 class Person(_name: String, var age: Int, var subject: String = "Kotlin") { var name = _name get() = field.plus("_01") set(value) { field = value.lowercase() } //次構(gòu)造函數(shù) constructor(_name: String, _age: Int) : this(_name, _age, "Java"){ this.name = _name.trim() } //無參是次構(gòu)造函數(shù) constructor() : this("", 1, "") //初始化代碼塊 init { //通過require函數(shù),對屬性值做合規(guī)判斷。如果 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.執(zhí)行順序
對應(yīng)屬性,可以通過主構(gòu)造函數(shù)、類屬性、初始化代碼塊、和次級構(gòu)造函數(shù),來進(jìn)行初始化。
那么他們的執(zhí)行順序就是上面這個順序。這個執(zhí)行順序要牢記,很關(guān)鍵,有可能會踩到坑。
4.延遲初始化
通過 lateinit這個關(guān)鍵字,實現(xiàn)延遲初始化。屬性可以在聲明時,不必賦初始值。但是在使用前必須賦值。可以通過::hobby.isInitialized 這個來判斷是否初始化完成。
lateinit var hobby:String fun initHobby(){ hobby="game" } fun isInit():Boolean{ //判斷屬性是否初始化 return ::hobby.isInitialized }
5.惰性初始化
通過by lazy可以實現(xiàn)惰性初始化。屬性聲明時不必賦值,使用這個屬性時,會自動初始化。
val lazy by lazy { lazyinit() } private fun lazyinit() :Boolean{ println("lazy init") return true }
到此這篇關(guān)于Kotlin類與屬性及構(gòu)造函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)Kotlin類 屬性 構(gòu)造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 實現(xiàn)調(diào)用系統(tǒng)照相機(jī)拍照和錄像的功能
這篇文章主要介紹了Android 實現(xiàn)調(diào)用系統(tǒng)照相機(jī)拍照和錄像的功能的相關(guān)資料,需要的朋友可以參考下2016-11-11詳解LeakCanary分析內(nèi)存泄露如何實現(xiàn)
這篇文章主要為大家介紹了詳解LeakCanary分析內(nèi)存泄露如何實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12android獲取圖片尺寸的兩種方式及bitmap的縮放操作
這篇文章主要介紹了android獲取圖片尺寸的兩種方式及bitmap的縮放操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android實現(xiàn)四級聯(lián)動地址選擇器
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)四級聯(lián)動地址選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-10-10Android頭像上傳功能的實現(xiàn)代碼(獲取頭像加剪切)
最近在做一個頭像上傳的項目,下面小編給大家分享Android頭像上傳功能的實現(xiàn)代碼,需要的的朋友參考下吧2017-08-08學(xué)習(xí)Android Material Design(RecyclerView代替ListView)
Android Material Design越來越流行,以前很常用的 ListView 現(xiàn)在也用RecyclerView代替了,實現(xiàn)原理還是相似的,感興趣的小伙伴們可以參考一下2016-01-01Android 使用Vitamio打造自己的萬能播放器(4)——本地播放(快捷搜索、數(shù)據(jù)存儲)
本文主要介紹android Vitamio 本地播放功能(快捷搜索,數(shù)據(jù)存儲),這里提供實例代碼和效果圖,有需要的小伙伴可以參考下2016-07-07詳解Android 基于TCP和UDP協(xié)議的Socket通信
這篇文章主要介紹了詳解Android 基于TCP和UDP協(xié)議的Socket通信,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Android 下載文件通知欄顯示進(jìn)度條功能的實例代碼
這篇文章主要介紹了Android 下載文件通知欄顯示進(jìn)度條功能的實例代碼,通過使用AsyncTask異步任務(wù)實現(xiàn),調(diào)用publishProgress()方法刷新進(jìn)度來實現(xiàn),具體代碼大家參考下本文2018-04-04