Kotlin學習系列(三)


類聲明

Kotlin使用class關鍵字聲明類:

class Invoice{

}

Kotlin類聲明基本包括header與body:

[<Modifier>] <class> [<Visibility modifiers>]  <className> [<constructor>]
[< body>] 

構造器

kotlin的類能有一個主要的構造器與多個次要的構造器。主構造器出現在類名的后面參數是可選的。

class Person constructor(firstName: String){
    ...
}

如果主構造器沒有注解或可見修飾符constructor關鍵字可以省略:

class Person(firstName: String){
...
}

Kotlin能夠使用constructor聲明多個次要的構造器:

class Person{
    constructor(parent: Person){
    
     }
     
       constructor(name: String, parent: Person){
    
     }
}

如果類有一個主構造器其他的構造器都需要去直接或間接的調用它:

class Person(val name: String){
    constructor(name: String, parent: Person): this(name){
      
     }
}

創建實例

Kotlin沒有new關鍵字,創建類的實例只需要調用對應的構造方法:

val invoice = Invoice()
val person = Person("xx")

繼承

所有的class有一個共同的超類Any如果類聲明時沒有指定超類默認繼承Any:

class Empty  //默認繼承Any

繼承一個指定的類通過在class header后面添加冒號與父類:

open class Base(p: Int)

class Derived(p: Int): Base(p)  //指定構造器

如果子類有主構造器可以在class header中初始化超類,如果該類沒有主構造器由其他的構造器通過super關鍵字直接或間接始化超類:

open class Base(p: Int)

class Derived: Base{

    constructor(p: Int): super(p){

    }
}

open注解與java中的final相反表示類是否可以被繼承,Kotlin中所有的類默認是final

重寫成員方法

Kotlin使用open標記成員是否可被重寫,override顯示說明該成員重寫父類方法:

open class Base {
    open fun v() {}
    fun nv() {}
}
class Derived() : Base() {
    override fun v() {}
}

屬性

聲明屬性語法:

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

除了初始化和getter/setter是可選的以外屬性類型如果能夠推斷出的話也可以省略。只讀屬性的聲明
語法與可讀屬性聲明只有兩個差別:使用val替換var、沒有setter。

Kotlin中的類聲明可變的(var)屬性與只讀(val)屬性:

class Person{
    public var name: String = ""
    public val IdCard: String =  "xxx"

}

通過屬性名稱使用類中的屬性,類似Java中的Field:

fun out(p: Person){

    println("name: ${p.name}")
    println("id: ${p.id}")
}

getter/setter:

    public var name: String
    get() = "undefined"
    set(value) {

    }

如果只需要重新定義getter/setter的可見性或注解它們但不需要去更改它們行為可以只定義getter/setter不需要定義主體:

    public var name: String = ""
    get() = "undefined"
    private @Inject set

Kotlin中不能有field,但是在自定義getter/setter的時候可能需要去直接訪問屬性而不是通過getter/settter。Kotlin自動提供
一個備用字段(field),通過它使用使用屬性標識符來訪問它。

    public var fieldProp = ""
    get() = field
    set(value) {
        field = value;
    }

編譯時常量

如果屬性能在編譯時就已經確定它的值可以使用const關鍵字聲明一個編譯時常量但它需要滿足以下要求:

  1. 只要出現在最頂層或對象內部
  2. 只支持String與原始類型
  3. 無法算自定義getter
const val COMPILE_CONSTANT = ""



《架構文摘》每天一篇架構領域重磅好文,涉及一線互聯網公司應用架構(高可用、高性 能、高穩定)、大數據、機器學習等各個熱門領域。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM