Kotlin從入門到放棄之基礎篇(四)——屬性、字段、接口

Kotlin從入門到放棄之基礎篇(四)

屬性和字段

屬性聲明

在Kotlin中我們使用var關鍵字聲明可變屬性,或者用val關鍵字聲明只讀屬性。

    public class Person{
        var name:String ="小明"
        var age: Int = 18
        val gender:String="男"
    }

我們可以像Java中那樣可以通過名稱直接使用一個屬性

    public class printPerson{
        var person = Person()
        print("name=${person.name}")
    }

Getters and Setters

聲明一個屬性的完整語法如下:

    var <propertyName>: <PropertyType> [=<property_initializer>]
    [<getter>]
    [<setter>]

其中initializer,getter和setter都是可選的。其中var關鍵字修飾的屬性是允許有getter和setter方法的,但是val關鍵字修飾的屬性是final類型的不允許有setter方法。
另外,能夠從成員函數或者初始化語句中推斷出屬性的類型,那麼在屬性聲明的時候是可以忽略PropertyType的。

備用字段

在Kotlin中不可以有字段。然而當使用自定義訪問器的時候需要備用字段,所以Kotlin使用field關鍵字提供了自動備用字段。

    var counter=0
    set(value){
        if(value>=0) filed = value
    }

♣ field關鍵字只能用於屬性的訪問器
編譯器會檢查訪問器的代碼,如果使用了備用字段(或者訪問器是默認的實現邏輯),就會自動生成備用字段,否則就不會。

備用屬性

如果備用字段不合適的話可以試試備用屬性。備用屬性隱式的對屬性值的初始化聲明避免空指針

    private var _table: Map<String, Int>? = null
    public val table: Map<String, Int>
    get() {
        if (_table == null)
        _table = HashMap() 
        return _table ?: throw AssertionError("Setto null by another thread")
    }

編譯時常量

那些在編譯時就知道具體值的屬性可以使用const關鍵字標記爲編譯時常量。該屬性需要滿足以下條件:
♣ 頂層或對象的成員
♣ 使用基本類型進行初始化
♣ 不能有自定義的getter方法
該屬性可以被當作註解使用:

    const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"@Deprected(SUBSYSTEM_DEPRECATED) fun foo() { ... }

延遲初始化屬性

那些擁有非空類型的屬性,需要在構造器中進行初始化,但是有時構造器並不能滿足所有需求。如果我們希望延遲屬性初始化的時間,就可以用到lateinit關鍵字。

  public  class Person{
        lateinit var student : Stuent
    }

這個修飾符只能用在被var關鍵字修飾的屬性中,不能用在構造方法中。並且,該屬性不能有自定義的getter和setter訪問器。這個屬性必須是非空的,同時,也不能是一個基本類型

接口

接口的定義

Kotlin中的接口很想Java8。可以包含抽象方法和方法的實現,但是接口不能保存狀態,意味着接口中的屬性必須是抽象的,或者提供訪問器的實現方式。

    interface DoSomething{
        fun run()//沒有方法體
        fun swim(){
            //有方法體
        }
    }

接口的實現

一個類可以實現多個接口

    class Person : DoSomething{
        fun run(){
            print("this is run")
        }
    }

接口中的屬性

接口中可以存在抽象的屬性,但是可以提供訪問器的實現。接口中的屬性不能有備用字段。

    interface DoSomething{
        val person : Person //默認爲abstract
    }

關於重寫衝突

在之前的章節中有詳細的討論,不再贅述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章