Kotlin基礎之構造方法

我是IT王魔王
這是我的第7篇IT系列原創(chuàng)

Kotlin系列我打算寫出最適合初學者入門的文章

網(wǎng)上有很多文章,這些文章寫的都不錯
但是鄙人以為,這些文章有一個共同的特點(是優(yōu)點,但同時也是缺點)
所以我用特點來形容

我一般不喜歡講廢話(這是一句廢話,sorry)
能用圖解決的盡量不用文字描述

java中的構造方法

/**
 * java person 類
 */
public class Person {
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

特點:
1、方法名與類名相同
2、不定義返回值類型

Kotlin中的構造方法

Kotlin中講構造方法獨立了出來,使用關鍵字constructor來表示。同時,Kotlin中將構造方法分為了兩類:主構造方法和次構造方法

主構造方法,每個類最多有1個

依然拿我們的Penguin類(企鵝的意思)舉例說明

為了不讓大家看著蒙圈,我專門把空參/有參構造方法寫在了一起,方便大家對比

主構造方法在類后面聲明??

1、空參主構造方法/有參主構造方法


空參/有參主構造方法

2、constructor關鍵字可以省略


constructor關鍵字可以省略

3、如果加權限修飾符,那么放到constructor前面,此時,就不能省略constructor關鍵字了

加了權限修飾符

再次強調(diào),當有了權限修飾符時,就不能省略constructor關鍵字了

不能省略constructor關鍵字

到這里,有關主構造方法的聲明語法就講完了
接下來我們會有另外一個問題,怎么用?

當使用有參構造方法時,我們怎么使用主構造方法中的參數(shù)呢?

java中的使用

java中使用構造方法中的參數(shù)

Kotlin的主構造方法是沒有方法體的,這就意味著我們無法在主構造方法中進行任何操作。
但Kotlin為我們提供了一個init代碼塊,這個代碼塊的執(zhí)行順序在主構造方法之后,次構造方法之前,我們可以在這個代碼塊中進行各種初始化的操作,包括訪問主構造方法中的參數(shù)??

/**
* kotlin 企鵝類
*/
class Penguin private constructor (name:String,age:Int) {

   var name:String?=null //名稱
   var age:Int=0  //年齡
   var weight:Int=100  //體重

   //kotlin為我們提供了一個init代碼塊,
   //init代碼塊的執(zhí)行順序在主構造方法之后
   //我們可以在init代碼塊中進行各種初始化操作
   //init代碼塊中可以訪問主構造方法中的變量
   init {
       this.name=name
       this.age=age
   }
}

終于不用截圖了,好輕松的說??
到這里,主構造方法的聲明加使用就講完了。
現(xiàn)在我們講一點有趣(奇怪)的知識


image.png

在上面這段代碼里,有一個小問題
這個問題小白是不介意的,大神們是無法忍受的,例如我-----就能忍受。

言歸正傳,我們來看這段代碼有什么問題??

image.png

一個字:太繁瑣。
Kotlin的設計理念之一就是要簡潔,越簡潔越好。讓大家把節(jié)省下來的時間去做更重要的事情,例如撩妹。

在一個類中聲明屬性,通過構造方法傳值進行初始化這種操作有沒有很頻繁,有沒有很繁瑣,雖然IDE給我們提供了快捷鍵,雖然你的手速也很快,但是要是能把這個過程“省略”掉就更完美了。
Kotlin讓提供了這樣的功能

主構造方法中聲明屬性

效果相同

左側的寫法跟右側的寫法效果完全相同。
var換成val也可以??

val也可以

好了,到這里,主構造方法的知識就真的講完了。
大家有沒有覺得學到這里的時候覺得Kotlin很爽,腰不酸了腿不疼了,一口氣上五樓不費勁了,奇怪的知識增加了。


奇怪的知識增加了

次構造方法,每個類可以有N個

次構造方法聲明在類中,依然使用constructor來聲明

/**
 * kotlin 企鵝類
 */
class Penguin {
    var weight:Int=100  //體重
    var age:Int=0
    var name:String?=null
    
    //空參次構造器
    constructor(){ }
    //有參次構造器
    constructor(name:String,age:Int){
        this.name=name
        this.age=age
    }
}

當構造方法中沒有邏輯時候,大括弧可以省略


/**
 * kotlin 企鵝類
 */
class Penguin {
    var weight:Int=100  //體重
    var age:Int=0
    var name:String?=null

    //空參次構造方法,如果沒有邏輯,可以省略大括弧
    constructor()
    //有參次構造方法,如果沒有邏輯,可以省略括弧,不過有參的空構造方法是沒有意義的
    constructor(name:String,age:Int)
}

當主構造器和次構造器同時存在時,次構造器必須直接或者間接調(diào)用主構造器

/**
 * kotlin 企鵝類
 */
class Penguin constructor(name: String) {
    var weight:Int=100  //體重
    var age:Int=0
    var name:String?=null

    //空參次構造器,調(diào)用了下面的次要構造方法
    constructor():this("奔波兒霸",10)

    //有參次構造器,調(diào)用了主構造方法
    constructor(name:String,age:Int):this(name){
        this.name=name
        this.age=age
    }
}

構造方法調(diào)用構造方法的方式如??代碼所示,使用:this來調(diào)用

執(zhí)行順序上,主構造器>init代碼塊>次構造器

與java相似,當我們不聲明任何構造方法時,Kotlin編譯器會默認給我們增加一個空參構造方法


/**
 * kotlin 企鵝類
 */
class Penguin constructor() {
    var weight:Int=100  //體重
    var age:Int=0
    var name:String?=null
}

如??,當我們不聲明任何構造方法時,Kotlin編譯器會默認給我們增加一個構造方法(眼睛看不著,編譯之后的代碼會看到)

到這里,有關Kotlin中的構造方法就講完了
總結一下
重點在主構造方法
當主構造方法和次構造方法同時存在,次構造方法必須調(diào)用主構造方法

聊天結束
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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