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

