kotlin-2-類(lèi)

1、kotlin 可見(jiàn)性修飾符

Java有四種:

  • public:包內(nèi)及包外的任何類(lèi)均可以訪問(wèn)
  • protected:包內(nèi)的任何類(lèi),及包外的那些繼承了此類(lèi)的子類(lèi)才能訪問(wèn)
  • 默認(rèn):包內(nèi)的任何類(lèi)都可以訪問(wèn)它,包外的任何類(lèi)都不能訪問(wèn)
  • private:包內(nèi)包外的任何類(lèi)均不能訪問(wèn)

Kotlin也是有四種:

  • public:默認(rèn)值日缨,什么都不寫(xiě)表示是public。
  • protected:和Java不同的是,即使在同一個(gè)包內(nèi)眷昆,也不能訪問(wèn)protected方法。比private多了子類(lèi)可以調(diào)用這一范圍汁咏。
  • internal:所在的整個(gè) module 可見(jiàn)
  • private:只在這個(gè)類(lèi)內(nèi)部可見(jiàn)亚斋。
2、kotlin 主構(gòu)造函數(shù)

主構(gòu)造函數(shù) 寫(xiě)在類(lèi)頭中 如果你不希望別的類(lèi)訪問(wèn)到這個(gè)變量攘滩,可以用private修飾

class Person constructor(firstName: String) {
}

如果主構(gòu)造函數(shù)沒(méi)有注解或可見(jiàn)性說(shuō)明帅刊,則 constructor 關(guān)鍵字是可以省略:
class Person (firstName: String) {
}

如果構(gòu)造函數(shù)有注解或可見(jiàn)性聲明,則 constructor 關(guān)鍵字是不可少的轰驳,并且可見(jiàn)性應(yīng)該在前
class Customer public @inject constructor (name: String) {...}

主構(gòu)造函數(shù)不能包含任意代碼厚掷。初始化代碼可以放在以 init 做前綴的初始化塊內(nèi)
class Person (firstName: String) {
  init {
        logger,info("Customer initialized with value ${firstName}")
    }
}

總結(jié)

  • 主構(gòu)造函數(shù) constructor寫(xiě)在類(lèi)頭中 弟灼,沒(méi)有修飾符或者注解修飾可以省略constructor關(guān)鍵字
  • 主構(gòu)造函數(shù)中,如果參數(shù)加var會(huì)自動(dòng)生成對(duì)應(yīng)的屬性
  • 主構(gòu)造函數(shù)中冒黑,如果你不希望別的類(lèi)訪問(wèn)到這個(gè)變量田绑,可以用private修飾
  • init代碼塊也屬于主構(gòu)造器的一部分,也可以引用主構(gòu)造函數(shù)中的變量
  • 如果沒(méi)有主構(gòu)造函數(shù)抡爹,也會(huì)隱式地創(chuàng)建一個(gè)無(wú)參構(gòu)造函數(shù)掩驱,
  • 創(chuàng)建對(duì)象不需要 new
3、kotlin 次構(gòu)造函數(shù)

類(lèi)也可以有二級(jí)構(gòu)造函數(shù)冬竟,需要加前綴 constructor:

  • 次級(jí)構(gòu)造函數(shù)不能直接將參數(shù)轉(zhuǎn)換為屬性(不能加var)
  • 如果有主構(gòu)造器欧穴,那么次構(gòu)造器必須直接或者間接引用到主構(gòu)造器
    在同一個(gè)類(lèi)中代理另一個(gè)構(gòu)造函數(shù)使用 this 關(guān)鍵字:
class Person(var firstName: String) {

    init {
        println("Customer initialized with value ${firstName}")
    }
    //var firstName: String? = null

    constructor() : this("Xiao ming")

    //不能直接將參數(shù)轉(zhuǎn)換為字段,
    constructor(firstName: String, lastName: String) : this(firstName) {
        this.lastName = lastName
    }

    var lastName: String? = null

}
4泵殴、 重寫(xiě)get set方法

聲明一個(gè)屬性的完整語(yǔ)法是
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]

其初始器(initializer)涮帘、getter 和 setter 都是可選的。屬性類(lèi)型如果可以從初始器 (或者從其 getter 返回值笑诅,如下文所示)中推斷出來(lái)调缨,也可以省略。

var allByDefault: Int?    *錯(cuò)誤:需要顯式初始化器吆你,隱含默認(rèn) getter 和 setter
var initialized = 1  * 類(lèi)型 Int弦叶、默認(rèn) getter 和 setter

在主構(gòu)造函數(shù)中 初始器(initializer) 才可以省略
class User {

    constructor(name: String, sex: Int) {
        this.name = name
        this.sex = sex
    }

    var name: String? = null
    var sex: Int? = null
        set(value) {
            // 此處 如果調(diào)用 sex 賦值 會(huì)造成死循環(huán) sex=0
            if (0 == value) { // 正確
                sexStr = "男"
            } else {
                sexStr = "女11"
            }
        }
    var sexStr: String? = null
//        get() {
//            // 此處 如果調(diào)用 sexStr 取值 會(huì)造成死循環(huán) if ("".equals(sexStr))
//            if (0 == sex) { // 正確
//                return "男"
//            }
//            return "女"
//        }

}

一般不需要重寫(xiě)get set方法,在某些特定場(chǎng)景下重寫(xiě)即可妇多,但注意避免死循環(huán)

5伤哺、 繼承

kotlin 中所有的類(lèi)和方法默認(rèn)都是final,不能直接繼承或者重寫(xiě)者祖,如果要繼承或重寫(xiě)立莉,需要加上open 關(guān)鍵字

open class Parent(var name: String) {

    var sex: String? = null

    init {
        this.name = "人"
    }

    // 沒(méi)有加open關(guān)鍵字,不能重寫(xiě)
    fun showParent() {

    }

    // 加open關(guān)鍵字可以重寫(xiě)
    open fun showSelf() {

    }
}

class Child( name: String):Parent (name){

    // 沒(méi)有加open關(guān)鍵字咸包,不能重寫(xiě)
//    fun showParent(){
//
//    }
    // 重寫(xiě)加 override  一般寫(xiě)法不換行
    override  fun showSelf(){

    }
}
6桃序、 接口

接口用關(guān)鍵字 interface 來(lái)定義:
個(gè)類(lèi)或?qū)ο罂梢詫?shí)現(xiàn)一個(gè)或多個(gè)接口

interface TestInterface {

    //可以在接口中聲明屬性,但屬性必須是抽象的 或 提供訪問(wèn)實(shí)現(xiàn)烂瘫。
    //private var name: Int   //這種寫(xiě)法錯(cuò)誤
    //var name: String? = null  //這種寫(xiě)法錯(cuò)誤
    var name: String
    abstract var sex: Int
    fun test()
}
class TestInterfaceImpl(override var name: String, override var sex: Int) : TestInterface {
    override fun test() {
        println(name+"--"+sex)
    }
}

接口中聲明的媒熊,必須是抽象的 或 提供訪問(wèn)實(shí)現(xiàn)

7、 抽象
abstract class A {
    //abstract val  name: String ? = null   寫(xiě)法錯(cuò)誤
    //val  name: String ? = null    寫(xiě)法正確
    abstract val  name: String     //寫(xiě)法正確

    //抽象類(lèi)里已經(jīng)提供實(shí)現(xiàn)的方法 要想被重寫(xiě)必須加open
    open fun test() {
        println(name)
    }
    abstract fun testNobody()
    //抽象類(lèi)里的方法,可以不提供提供實(shí)現(xiàn)的時(shí)候需要用abstract關(guān)鍵字來(lái)描述 抽象的方法默認(rèn)是open的
}
class B:A() {

    override val  name: String=""
    override fun test() {
        println(name)
    }
    override fun testNobody(){
    }
}

抽象類(lèi)里,抽象的方法默認(rèn)是open的坟比,非抽象方法是final的
可以不提供提供實(shí)現(xiàn)的時(shí)候需要用abstract關(guān)鍵字來(lái)描述
抽象類(lèi)里 可以有屬性芦鳍,屬性必須是非null的或者抽象的

8、可以使用默認(rèn)參數(shù)來(lái)實(shí)現(xiàn)java重載類(lèi)似的功能
    //函數(shù)參數(shù)可以設(shè)置默認(rèn)值,當(dāng)參數(shù)被忽略時(shí)會(huì)使用默認(rèn)值葛账。這樣相比其他語(yǔ)言可以減少重載
    fun reformat(name: String, sex: Boolean = true,age: Int= 18) {

    }
    reformat("TOM")
    reformat("Tom", true, 18)
9柠衅、data

在Kotlin中一些只保存數(shù)據(jù)的類(lèi),稱(chēng)為數(shù)據(jù)類(lèi)(data class),
為了確保自動(dòng)生成的代碼一致性和有意義,數(shù)據(jù)類(lèi)(data class)必須滿足以下要求:

  • 主構(gòu)造函數(shù)至少有一個(gè)參數(shù);
  • 主構(gòu)造函數(shù)的所有參數(shù)需標(biāo)記為val 或 var;
  • 數(shù)據(jù)類(lèi)不能是抽象、開(kāi)放籍琳、密封或者內(nèi)部的;

編譯器會(huì)為數(shù)據(jù)類(lèi)(data class)自動(dòng)生成以下函數(shù):

  • equals()/hashCode()
  • toString() 默認(rèn)輸出"User(name=John, age=42)"
  • componentN() 按聲明順序?qū)?yīng)于所有屬性
  • copy()
10菲宴、copy
  • 當(dāng)要復(fù)制一個(gè)對(duì)象,只改變一些屬性,但其余不變,copy()就是為此而生:
        data class DataUser(val name: String, val age: Int)
        val u = DataUser(name = "lioil", age = 1)
        val u1 = u.copy("win")   //傳遞第一參數(shù),第二參數(shù)默認(rèn)
        val u2 = u.copy("win",2) //傳遞所有參數(shù)
        val u3 = u.copy(age = 3) //命名參數(shù),傳遞指定參數(shù)
        println("$u1,$u2,$u3")

DataUser(name=win, age=1),DataUser(name=win, age=2),DataUser(name=lioil, age=3)
11贷祈、apply
  • apply函數(shù),在函數(shù)范圍內(nèi)喝峦,可以任意調(diào)用該對(duì)象的任意方法势誊,并返回該對(duì)象
data class DataUser(val name: String, var age: Int){
    fun test (){
        println("test")
    }
}

val u = DataUser(name = "lioil", age = 1)
val u1 =  u.apply {
       age = 15
       test()
}
println("$u1")

mame 是無(wú)法修改的 因?yàn)槭莢al
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谣蠢,隨后出現(xiàn)的幾起案子粟耻,更是在濱河造成了極大的恐慌,老刑警劉巖眉踱,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤忙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谈喳,警方通過(guò)查閱死者的電腦和手機(jī)册烈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)婿禽,“玉大人茄厘,你說(shuō)我怎么就攤上這事√竿穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵胎署,是天一觀的道長(zhǎng)吆录。 經(jīng)常有香客問(wèn)我,道長(zhǎng)琼牧,這世上最難降的妖魔是什么恢筝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮巨坊,結(jié)果婚禮上撬槽,老公的妹妹穿的比我還像新娘。我一直安慰自己趾撵,他們只是感情好侄柔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著占调,像睡著了一般暂题。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上究珊,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天薪者,我揣著相機(jī)與錄音,去河邊找鬼剿涮。 笑死言津,一個(gè)胖子當(dāng)著我的面吹牛攻人,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悬槽,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怀吻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陷谱?” 一聲冷哼從身側(cè)響起烙博,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烟逊,沒(méi)想到半個(gè)月后渣窜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪躯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年乔宿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访雪。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡详瑞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臣缀,到底是詐尸還是另有隱情坝橡,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布精置,位于F島的核電站计寇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脂倦。R本人自食惡果不足惜番宁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖阻。 院中可真熱鬧蝶押,春花似錦、人聲如沸火欧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)布隔。三九已至离陶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衅檀,已是汗流浹背招刨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哀军,地道東北人沉眶。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓打却,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谎倔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柳击,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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