Kotlin入門(五):類與繼承



類的創(chuàng)建

與Java一樣窃页,Kotlin也是用class關鍵字聲明類啤覆。

class User{}

Kotlin中一個類可以有一個主構造方法(primary constructor)和一個或多個次構造方法( secondary constructors)徙鱼。

主構造方法

主構造方法通過在類名后面添加constructor和參數實現:

class User private constructor(name: String) {}

如果沒有注解和可見的修飾符宅楞,constructor關鍵字可以省略:

class User(name: String) {}
  • 初始化順序
    類內部的init模塊和變量的初始化順序按照他們出現的順序進行
fun main(args: Array<String>) {
    User("mao")
}

class User(name: String) {
    val firstProperty = "First property".also(::println)

    init {
        println("First initializer")
    }

    val secondProperty = "Second property".also(::println)

    init {
        println("Second initializer")
    }
}

輸出:

First property
First initializer
Second property
Second initializer
  • 成員變量和init模塊在初始化時可直接使用主構造方法中的參數
class User(name: String) {
    var mName = name

    init {
        var mName = name
    }
}

次構造方法

  • 次構造方法也使用constructor實現
class User {

    var name: String = ""

    constructor(name: String) {
        this.name = name
    }
}
  • 當類聲明了主構造方法,所有次構造方法必須直接或間接調用主構造方法
class User() {
    constructor(name: String) : this() {
        print("conconstructor")
    }

    constructor(name: String, age: Int) : this(name) {}
}
  • 類中的變量初始化和init模塊初始化都是主構造方法的一部分袱吆,所以都在次構造方法之前執(zhí)行
fun main(args: Array<String>) {
    User("mao")
}

class User() {
    constructor(name: String) : this() {
        print("conconstructor")
    }
    
    var name = "property".also(::println)
    init{
        println("init")
    }
}

輸出:

property
init
conconstructor
  • 當一個類沒有任何構造方法時傍菇,默認生成一個public類型的無參主構造方法褐奥,如果不希望這個默認構造方法存在强胰,可以主動聲明一個主構造方法
class User private constructor() {}


繼承

  • Kotlin中的類默認是final類型的侨歉,想要被繼承,得用“open”關鍵字修飾处铛。
open class Shape {}

class Rectangle : Shape {}
  • 子類的所有構造構造方法必須直接或間接調用一個父類的構造方法
open class Shape {
    constructor(name: String) {
        print(name)
    }
}

class Rectangle : Shape {
    constructor(name: String) : super(name) {}

    constructor(name: String, age: Int) : this(name) {}
}
  • 方法重寫
    繼承過程中饲趋,只有open修飾的方法才能被重寫,重寫時要用override修飾撤蟆。
    open特性也能被繼承奕塑,想要斷了open特性,只需用final修飾即可家肯。
open class Shape {
    open fun method() {}
}

open class Rectangle : Shape() {
    override fun method() {}
}

class Square : Rectangle() {
    final override fun method() {}
}
  • 成員變量重寫
    與方法重寫相同龄砰,只有open修飾的變量才能被重寫,open同樣可以繼承,也可以用final中斷换棚。
    重寫過程中式镐,變量可由val類型變?yōu)関ar類型,反之則不行固蚤。
open class Shape {
    open val name: String = "Shape"
}

open class Rectangle : Shape() {
    override var name: String = "Rectangle"
}

class Square : Rectangle() {
    final override var name = "Square"
}
  • 調用父類方法和成員變量
    可通過“super”關鍵字調用父類的方法和成員變量
open class Shape {
    open val name: String = "Shape"
    open fun draw() {}
}

open class Rectangle : Shape() {
    override var name: String = super.name
    override fun draw() {
        super.draw()
    }
}
  • 內部類調用外部類父類的方法
    使用“super@Outer”方式:
open class Sup {
    open fun method() { println("Sup.method") }
}

class Sub:Sup(){
    inner class Inner{
        fun test(){
            super@Sub.method()
        }
    }
}
  • 當繼承的類和接口當中出現相同的方法(方法名和參數都相同)娘汞,通過類似泛型的方法明確調用哪個方法
interface Action {
    fun eat() {
        println("Action")
    }
}

open class Animal {
    open fun eat() {
        println("Animal")
    }
}

class Human() : Animal(), Action {
    override fun eat() {
        super<Action>.eat()
        super<Animal>.eat()
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夕玩,隨后出現的幾起案子你弦,更是在濱河造成了極大的恐慌,老刑警劉巖燎孟,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禽作,死亡現場離奇詭異,居然都是意外死亡揩页,警方通過查閱死者的電腦和手機旷偿,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碍沐,“玉大人狸捅,你說我怎么就攤上這事衷蜓±厶幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵磁浇,是天一觀的道長斋陪。 經常有香客問我,道長置吓,這世上最難降的妖魔是什么无虚? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮衍锚,結果婚禮上友题,老公的妹妹穿的比我還像新娘。我一直安慰自己戴质,他們只是感情好度宦,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著告匠,像睡著了一般戈抄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上后专,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天划鸽,我揣著相機與錄音,去河邊找鬼。 笑死裸诽,一個胖子當著我的面吹牛嫂用,可吹牛的內容都是我干的。 我是一名探鬼主播丈冬,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼尸折,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殷蛇?” 一聲冷哼從身側響起实夹,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粒梦,沒想到半個月后亮航,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匀们,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年缴淋,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泄朴。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡重抖,死狀恐怖,靈堂內的尸體忽然破棺而出祖灰,到底是詐尸還是另有隱情钟沛,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布局扶,位于F島的核電站恨统,受9級特大地震影響,放射性物質發(fā)生泄漏三妈。R本人自食惡果不足惜畜埋,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畴蒲。 院中可真熱鬧悠鞍,春花似錦、人聲如沸模燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涧窒。三九已至心肪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纠吴,已是汗流浹背硬鞍。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人固该。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓锅减,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伐坏。 傳聞我的和親對象是個殘疾皇子怔匣,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • 面向對象編程(OOP) 在前面的章節(jié)中每瞒,我們學習了Kotlin的語言基礎知識、類型系統(tǒng)纯露、集合類以及泛型相關的知識剿骨。...
    Tenderness4閱讀 4,425評論 1 6
  • Scala與Java的關系 Scala與Java的關系是非常緊密的!埠褪! 因為Scala是基于Java虛擬機浓利,也就是...
    燈火gg閱讀 3,424評論 1 24
  • 前言 人生苦多,快來 Kotlin 钞速,快速學習Kotlin贷掖! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,161評論 9 118
  • ^_^天氣轉暖渴语,萬物復蘇苹威,花草樹木們熬過了寒冬,迎來了春天遵班,有的長的綠油油的屠升,有的開出鮮艷的花朵……駐足觀賞潮改,令人...
    思維導圖實戰(zhàn)派黃群閱讀 325評論 0 2
  • 曾有一段時間狭郑,我十分低落,萎靡不振汇在。 那時翰萨,我還在上初中。那是一所非常著名的學校糕殉,而我的成績一向是很差的亩鬼,如果不是...
    一點燈閱讀 951評論 1 8