【KtAndroid - 6】類與對象

類與對象之間的關(guān)系

直接進(jìn)入主題。

類:對象的模板

對象:類的實(shí)現(xiàn)

類只有通過(new Instance)對象實(shí)例后才能調(diào)用該類中定義的字段、方法!

通俗理解就是,類表示法律,對象就必須要遵守這個(gè)法律。如果不遵守Exception

以上就是面向?qū)ο笏枷耄?/strong>

在java與kotlin類的定義近乎相同,都是使用關(guān)鍵字是class作為定義類的標(biāo)識符:

<public> class JavaFile{...}

public是可省略的,在java中如果舍去了public那么默認(rèn)標(biāo)識符就是default

然而在kotlin中,如果省去了public那么默認(rèn)的就是public

*在kotlin中是可以使用java的可見性修飾符的,只不過默認(rèn)是被隱藏的

1.png

網(wǎng)上找了一張圖片,大家可以看看。

但是……你以為類的定義僅僅是這樣么?

嘖嘖,太天真了!

在kotlin中,還存在一個(gè)空類的概念:

//定義一個(gè)空類
class Empty

沒錯(cuò),就這樣,沒有類體!

一. 構(gòu)造器

java中我們定義類,通常是這樣的:

public class JavaFile{
    private String name;
    
    public JavaFile(String name){
        this.name = name;
    }
    
    public String getName(){
        return this.name;
    }
    
    public void setName(String name){
        this.name = name;
    }
}

雖然在kotlin中也有類似的寫法。

class KtFile {
    private var name: String = ""

    constructor(name: String) {
        this.name = name
    }

    fun getName(): String {
        return name
    }

    fun setName(name: String) {
        this.name = name
    }
}

但是,一般不這么寫,kotlin之所以有簡潔、高效這一說法,那么我們就來看看簡潔、高效的寫法。

一步一步來!

//這樣寫
class KtFile1{
    constructor(name: String) {
        var name: String = name
    }
}

//這樣寫
class KtFile2(name: String) {
    var name: String = name
}

//還能這樣寫
class KtFile3(var name: String) {}

怎么樣?沒想到吧?

來看第三種寫法(最簡寫法),在第三種寫法中,kotlin直接將類當(dāng)做方法來寫,只是修飾符不同,一個(gè)是fun一個(gè)是class

那么既然構(gòu)造器已經(jīng)寫在類名后面了,如果我有一系列初始化操作,該怎么辦呢?

1). init{}

init{}

kotlin中提供了一個(gè)init{}寫法

class KtFile3(var name: String) {
    init {
        name = "姓名=$name"
    }
}

2). 次要構(gòu)造器

同時(shí)kotlin中頁提供了一個(gè)次構(gòu)造器的說法 可以用java中的方法重載來理解

class KtFile3(val name: String) {
    constructor (name: String, age:Int) : this(name) {
        
    }
}

如果你聲明了一個(gè)次要構(gòu)造器,那么就需要讓它代理主構(gòu)造器了,也就是上面的:this(name)

3). 私有構(gòu)造器

在java中構(gòu)造器的私有就是直接將private加在構(gòu)造方法上,kotlin中也一樣

class KtFile4 private constructor(){
    ……
}

這么寫就代表了這是一個(gè)私有構(gòu)造器

二. get、set方法

在java中創(chuàng)建get/set方法很簡單,就如上面所寫

public String getName(){
    return this.name;
}

public void setName(String name){
    this.name = name;
}

在kotlin中其實(shí)已經(jīng)是默認(rèn)了getset方法,如果需要顯示的寫出來。

class KtFile3(var name: String) {
    var age: Int = 0
    get() = field
    /*get(){
        return field
    }*/
    set(value) {
        if (value > 100)
            field = 100
        else if (value < 1)
            field = 1
        else
            field = value
    }
}

使用則是與正常的賦值相同:

fun main(args: Array<String>) {
    val k = KtFile("k")
    val k2 = KtFile2("k2")
    val k3 = KtFile3("k3")

    println(k.getName())
    println(k2.name)
    println(k3.name)

    k3.age = 101
    println(k3.age)
}

結(jié)果:

2.png

*這里之所以會用field代替變量名,是因?yàn)橐坏┦褂迷兞?code>age將會造成無限遞歸。另外就是getset中并不是不允許有var,只是不能有與該變量相同名稱的var

還有一點(diǎn)值得注意的是如果修飾符是val那么該變量(常量)是沒有set方法的

3.png

最后一點(diǎn):get、set方法只能被public修飾

4.png

三. 對象的創(chuàng)建

在上面其實(shí)也已經(jīng)寫出來了。

在kotlin中,對象的創(chuàng)建并不需要new關(guān)鍵字

fun main(args: Array<String>) {
    val k = KtFile("k")
    var k2 = KtFile2("k2")
}

這樣就直接得到一個(gè)對象。

總結(jié)

  1. kotlin中存在空類體的定義方式
  2. kotlin中構(gòu)造器可以直接寫成class 類名 (var 字段1:類型, val 字段2:類型){……}的方式。
  3. kotlin中允許出現(xiàn)子(次)構(gòu)造器,但是必須代理主構(gòu)造器,關(guān)鍵字this
  4. kotlin中get、set方法默認(rèn)隱式,也可以顯示寫在字段下方;引用字段需使用field代替,不能直接使用字段名,會造成死遞歸;以val所修飾的字段不允許有set方法。
  5. kotlin中對象的創(chuàng)建不需要new關(guān)鍵字
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容