Kotlin基本語(yǔ)法之(四)成員變量與get生宛、set方法

在之前的文章中我們講到,Kotlin類中的屬性既可以用關(guān)鍵字var聲明為可變的帖烘,也可以用關(guān)鍵字val聲明為只讀的亮曹。

成員變量(屬性)

默認(rèn)情況下,使用var/val聲明的屬性可通過對(duì)象直接訪問秘症,即是public修飾的,除非為屬性聲明private修飾符式矫。

open class Person {
    var age: Int? = null
}

@JvmStatic
fun main(args: Array<String>) {
    val p = Person()
    //為屬性賦值
    p.age = 10
    println(p.age.toString())
}

在Kotlin的世界里成員變量也可被子類復(fù)寫乡摹。同方法的復(fù)寫一樣,需要在父類的成員屬性前聲明open表示可復(fù)寫采转,子類聲明override表示重寫聪廉。

open class Person {
   //屬性聲明open表示可重寫
   open var age: Int? = null
}
open class Student: Person() {
    //重寫父類屬性
    override var age: Int? = 10*10
}

默認(rèn)情況下屬性在聲明時(shí)必須賦值,除非把屬性也聲明為abstract的故慈,類中有抽象屬性時(shí)必須聲明為抽象類板熊。

非基本類型的不可空類型(val)的屬性可延遲初始化賦值,使用lateinit實(shí)現(xiàn)該功能察绷。只要保證在使用此屬性時(shí)已賦值即可干签,若仍未賦值則會(huì)拋出屬性尚未初始化異常。

open class Person {
    //延遲初始化
    lateinit var str: String
    
    fun getUpper(): String {
        return str.toUpperCase()
    }
}

@JvmStatic
fun main(args: Array<String>) {
    val p = Person()
    //kotlin.UninitializedPropertyAccessException
    //lateinit property str has not been initialized
    println(p.getUpper())
}

若想避免上述異巢鸷常可以在使用屬性前使用isInitialized方法判斷容劳。

open class Person {
    lateinit var str: String

    fun work() {
        if(::str.isInitialized) {
            println("str is isInitialized")
        } else {
            println("str is not isInitialized")
        }
    }
}

getter/setter

默認(rèn)情況下每個(gè)屬性都具有g(shù)etter/setter方法
聲明一個(gè)屬性的完整語(yǔ)法如下:

var <propertyName>[: <PropertyType>] [= <property_initializer>] 
    [<getter>]
    [<setter>]

屬性初始值喘沿、getter/setter是可缺省,如果屬性類型可以從初始值或getter中推斷出來(lái)則也可缺省竭贩。val類型的屬性不具備setter蚜印。

屬性的getter/setter均可復(fù)寫,即自定義訪問器留量。如果我們定義了一個(gè)自定義的setter窄赋,那么每次給屬性賦值時(shí)都會(huì)調(diào)用它。

來(lái)看一個(gè)例子:

open class Person {
    var age: Int = 10
        //getter缺省為默認(rèn)
        //setter設(shè)置參數(shù)前打印參數(shù)
        set(value) {
            println("setter $value")
            //field關(guān)鍵字指向?qū)傩员旧?            field = value
        }
}

@JvmStatic
fun main(args: Array<String>) {
    val p = Person()
    println(p.age)
    p.age = 30
    println(p.age)
}

打印結(jié)果:

10
setter 30
30

這里需要解釋一下楼熄,set方法聲明的value是參數(shù)名忆绰,表示屬性實(shí)際賦值時(shí)的那個(gè)對(duì)象,約定俗成寫做value孝赫,可以隨意寫成其他较木。

field指向當(dāng)前屬性,field標(biāo)識(shí)符只能用在屬性的訪問器內(nèi)青柄。

若想控制setter訪問伐债,可以私有化setter。

var setterVisibility: String = "abc"
        // 此 setter 是私有的并且有默認(rèn)實(shí)現(xiàn)
        private set 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末致开,一起剝皮案震驚了整個(gè)濱河市峰锁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌双戳,老刑警劉巖虹蒋,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異飒货,居然都是意外死亡魄衅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門塘辅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晃虫,“玉大人,你說我怎么就攤上這事扣墩≌芤” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵呻惕,是天一觀的道長(zhǎng)荆责。 經(jīng)常有香客問我,道長(zhǎng)亚脆,這世上最難降的妖魔是什么做院? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上山憨,老公的妹妹穿的比我還像新娘查乒。我一直安慰自己,他們只是感情好郁竟,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布玛迄。 她就那樣靜靜地躺著,像睡著了一般棚亩。 火紅的嫁衣襯著肌膚如雪蓖议。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天讥蟆,我揣著相機(jī)與錄音勒虾,去河邊找鬼。 笑死瘸彤,一個(gè)胖子當(dāng)著我的面吹牛修然,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播质况,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼愕宋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了结榄?” 一聲冷哼從身側(cè)響起中贝,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臼朗,沒想到半個(gè)月后邻寿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡视哑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年绣否,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挡毅。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枝秤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慷嗜,到底是詐尸還是另有隱情,我是刑警寧澤丹壕,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布庆械,位于F島的核電站,受9級(jí)特大地震影響菌赖,放射性物質(zhì)發(fā)生泄漏缭乘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一琉用、第九天 我趴在偏房一處隱蔽的房頂上張望堕绩。 院中可真熱鬧策幼,春花似錦、人聲如沸奴紧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)黍氮。三九已至唐含,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沫浆,已是汗流浹背捷枯。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留专执,地道東北人淮捆。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像本股,于是被迫代替她去往敵國(guó)和親攀痊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容