Kotlin從入門到放棄(五) 類和對象

Kotlin從入門到放棄(五) 類和對象

本篇主要記錄Kotlin對類和對象的具體用法,實現(xiàn)類的繼承和定義特殊的類骗卜。

1.類的構(gòu)造

1.1類的簡單定義

我們先來看看Android開發(fā)中見過多次的MainActivity類季二,在Java 中寫法如下:

public class MainActivity extend AppCompatActivity {
    ...
}

對應(yīng)的Kotlin代碼是下面這樣的:

class MainActivity : AppCompatActivity() {
    ...
}

Kotlin類對應(yīng)的寫法和Java之間有下面幾點區(qū)別:

  1. Kotlin省略關(guān)鍵字public竿滨,默認(rèn)它是開放的嘉抒。
  2. Kotlin用冒號“:”代替exdents迹鹅,也就是通過冒號表示繼承關(guān)系炼绘。
  3. Kotlin進(jìn)行繼承時织盼,父類后面多了括號“()”
    我們從簡單的類定義開始巫财,下面是Animal動物類的定義
class Animal{
    init{
        println("這是個動物的類")
    }
}

 tx.setOnClickListener{
      var animal = Animal()
 }
  1. Kotlin對類進(jìn)行初始化的函數(shù)叫做init
  2. Kotlin在創(chuàng)建實例的時候省略了關(guān)鍵字new

1.2類的構(gòu)造函數(shù)

構(gòu)造函數(shù)的輸入?yún)?shù)直接加到類名后面盗似,init方法進(jìn)表示創(chuàng)建類實例的初始化函數(shù)。

class Animal constructor(context: Context, name: String){
    init{
        print("這是類的$name")
    }
}

Kotlin設(shè)定主構(gòu)造函數(shù)不是必需的平项,我們可以把幾個構(gòu)造函數(shù)都放在類內(nèi)部的定義赫舒,從而都變成二級構(gòu)造函數(shù),去掉主構(gòu)造函數(shù)葵礼。

class Animal {
    constructor(context: Context, name: String) {
        print("這是$name")
    }
    constructor(context: Context, name: String, sex:Int) {
        print("這是$name")
    }
}

二級構(gòu)造函數(shù)與普通函數(shù)相比有下面幾個區(qū)別:

  1. 二級構(gòu)造函數(shù)沒有函數(shù)名稱号阿,只用關(guān)鍵字constructor表示這是一個構(gòu)造函數(shù)
  2. 二級構(gòu)造函數(shù)需要調(diào)用主構(gòu)造函數(shù)。

1.3帶默認(rèn)參數(shù)的構(gòu)造函數(shù)

Kotlin可以寫成帶默認(rèn)參數(shù)的構(gòu)造函數(shù)鸳粉,新的主構(gòu)造函數(shù)既能輸入兩個參數(shù)扔涧,又能輸入三個參數(shù)。

class Animal (context: Context, name: String, sex:Int = 0){
    init {

    }
}

2.類的成員

2.1成員屬性

Kotlin的屬性聲明代碼如下

class Animal (var context: Context, var name: String, val sex:Int = 0){
    init {
    }
}
  1. 在命名參數(shù)前面加“var”届谈,表示同時聲明與該參數(shù)同名的可變屬性并自動賦值
  2. 在命名參數(shù)前面加“val”枯夜,表示同時聲明與該參數(shù)同名的不可變屬性并自動賦值
    但是如果某個字段并非入?yún)⒌耐麑傩裕托枰陬惖膬?nèi)部顯式聲明該屬性字段艰山。
class Animal (var context: Context, var name: String, val sex:Int = 0){
    var sexName:String = "Kotlin"
    init {
    }
}

非空的成員屬性必須在聲明時賦值或者在構(gòu)造函數(shù)中賦值湖雹。

2.2成員方法

類的成員函數(shù)聲明和前面講解的函數(shù)聲明沒什么差異。
調(diào)用方式同Java曙搬。

2.3伴生對象

Kotlin取消了關(guān)鍵字static摔吏,無法直接聲明靜態(tài)類和靜態(tài)成員鸽嫂、方法。但是Kotlin引入了半生對象的概念征讲。利用伴生對象可以間接實現(xiàn)靜態(tài)成員的功能据某。

class Animal (var context: Context, var name: String, val sex:Int = 0){
    var sexName:String = "Kotlin"
    init {

    }
    //在類加載時就運(yùn)行伴生對象的代碼塊,相當(dāng)于Java里面的static{...}代碼塊
    //companion表示伴生诗箍,object表示對象癣籽, AnimalCompany表示伴生對象的名稱
    companion object AnimalCompany{
        fun judgeSex(sexName: String):Int {
            var sex:Int = when(sexName) {
                "公" -> 1
                "母" -> 0
                else -> -1
            }
            return sex
        }
    }
}

2.4靜態(tài)屬性

在伴生對象中增加常量字段的定義即可。

companion object AnimalCompany{
        val MALE = 0
        val FEMALE = 1
        fun judgeSex(sexName: String):Int {
            var sex:Int = when(sexName) {
                "公" -> MALE
                "母" -> FEMALE
                else -> -1
            }
            return sex
        }
    }

3.類的繼承

3.1開放修飾符

Kotlin默人每個類都不能被繼承滤祖,如果想要某個類成為基類筷狼,就需要把此類開放出來,也就是添加關(guān)鍵字open作為修飾符匠童。

open class Animal (var context: Context, var name: String, val sex:Int = 0){
    var sexName:String = "Kotlin"
    init {
    }
}
開放修飾符 說明
public 對所有人開放埂材,默認(rèn)就是public類型
internal 只對模塊內(nèi)部開放,模塊一般指一個App汤求,軟件或者系統(tǒng)本身
protected 自己和子類
private 自己

open不控制訪問權(quán)限楞遏,只是決定能不能被繼承。

3.2抽象類

Kotlin中也存在抽象類首昔。用法同Java。

3.3接口

在實現(xiàn)接口時候直接把接口名放在冒號后面

//定義接口
interface Behavior {
    var name:String
    fun fly():String
}
//實現(xiàn)接口
class Animal (var context: Context, var name: String, val sex:Int = 0): Behavior{
    var sexName:String = "Kotlin"
    init {

    }
     override fun fly(): String {
        return  behavior
     }
     override var behavior:String = "Kotlin"
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糙俗,一起剝皮案震驚了整個濱河市勒奇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巧骚,老刑警劉巖赊颠,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異劈彪,居然都是意外死亡竣蹦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門沧奴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痘括,“玉大人,你說我怎么就攤上這事滔吠「倬” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵疮绷,是天一觀的道長翰舌。 經(jīng)常有香客問我,道長冬骚,這世上最難降的妖魔是什么椅贱? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任懂算,我火速辦了婚禮,結(jié)果婚禮上庇麦,老公的妹妹穿的比我還像新娘计技。我一直安慰自己,他們只是感情好女器,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布酸役。 她就那樣靜靜地躺著,像睡著了一般驾胆。 火紅的嫁衣襯著肌膚如雪涣澡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天丧诺,我揣著相機(jī)與錄音入桂,去河邊找鬼。 笑死驳阎,一個胖子當(dāng)著我的面吹牛抗愁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呵晚,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜘腌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饵隙?” 一聲冷哼從身側(cè)響起撮珠,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎金矛,沒想到半個月后芯急,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡驶俊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年娶耍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饼酿。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡榕酒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗜湃,到底是詐尸還是另有隱情奈应,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布购披,位于F島的核電站杖挣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刚陡。R本人自食惡果不足惜惩妇,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一株汉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歌殃,春花似錦乔妈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至波材,卻和暖如春股淡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廷区。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工唯灵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隙轻。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓埠帕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玖绿。 傳聞我的和親對象是個殘疾皇子敛瓷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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