[Kotlin] 剖析val與const val的區(qū)別

Kotlin中valconst都有不可修改或者甚至是常量的含義,那它們存在的是否重復(fù)?有沒有差別呢?

valconst的差別

1. val的含義

  • 當(dāng)它修飾局部變量時,它的含義與Java中的final相同,讓局部變量不能被修改。如下示例

    fun foo(): Unit {
        val record: Int = 5
        ........
    }
    

    等同于Java中的

    void foo() {
        final int record = 5
        ........
    }
    
  • 當(dāng)它修飾成員變量或頂層變量時,為不可修改的屬性

    • 注意只能說是屬性,不能說是成員變量,因?yàn)閗otlin會為val修飾的頂層變量默認(rèn)添加一個 getter方法,讓它能夠像getXXX(): XX方法一樣被訪問。
    • 另一方面,它也為子類能夠重寫此成員屬性提供的可能,為它添加open修飾后,子類override此屬性時,其實(shí)是在重寫它的getter方法。

    如下示例,

    class A {
        val record: Int = 5
        ........
    }
    

    等同于Java中的

    class A {
        private final int record = 5
    
        public int getRecord() {
            return this.record;
        }
        ........
    }
    

2. const val的差別

這種修飾只能出現(xiàn)在頂層變量或成員變量身上。

  • 當(dāng)它修飾的成員變量和頂層變量時,被修飾的變量會被處理為靜態(tài)常量。注意,這里是常量而不是屬性,因?yàn)榇藭r被修飾的變量不會被自動添加getter方法,而是作為一個常規(guī)的靜態(tài)常量來對待。
  • 因此它也不可被子類派生重寫。
  • 同時,它的訪問域默認(rèn)為public。

如下示例,

class A {
    const val record: Int = 5
}

等同于Java中的

class A {
    public static final int record = 5
}

3. private const val的差別

它除了第二點(diǎn)說到的特性外,主要的作用就是把const val的默認(rèn)訪問域從public改為private了。如下示例,

class A {
    private const val record: Int = 5
}

等同于Java中的

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

相關(guān)閱讀更多精彩內(nèi)容

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