专栏名称: wanderingguy
职业码农,退役运动员 简书: https://www.jianshu.com/u/0bcca8b23127
目录
相关文章推荐
军武次位面  ·  重归故里:突朗自行火炮 ·  6 天前  
军武次位面  ·  不停发|五粮液感恩系列杀疯了!经典浓香1.7 ... ·  5 天前  
51好读  ›  专栏  ›  wanderingguy

Kotlin基本语法之(四)属性与getter-setter方法

wanderingguy  · 掘金  ·  · 2019-08-20 00:10

正文

阅读 5

Kotlin基本语法之(四)属性与getter-setter方法

在之前的文章中我们讲到,Kotlin类中的属性既可以用关键字 var 声明为可变的,也可以用关键字 val 声明为只读的。

成员变量(属性)

默认情况下,使用var/val声明的属性可通过对象直接访问,即是public修饰的,除非为属性声明private修饰符。

open class Person {
    var age: Int? = null
}

@JvmStatic
fun main(args: Array<String>) {
    val p = Person()
    //为属性赋值
    p.age = 10
    println(p.age.toString())
}
复制代码

在Kotlin的世界里成员变量也可被子类复写。同方法的复写一样,需要在父类的成员属性前声明open表示可复写,子类声明override表示重写。

open class Person {
   //属性声明open表示可重写
   open var age: Int? = null
}
open class Student: Person() {
    //重写父类属性
    override var age: Int? = 10*10
}
复制代码

默认情况下属性在声明时必须赋值,除非把属性也声明为abstract的,类中有抽象属性时必须声明为抽象类。

非基本类型的不可空类型(val)的属性可延迟初始化赋值,使用 lateinit 实现该功能。只要保证在使用此属性时已赋值即可,若仍未赋值则会抛出属性尚未初始化异常。

open class Person {
    //延迟初始化
    lateinit var str: String
    
    fun getUpper(): String {
        return str.toUpperCase()
    }
}

@JvmStatic
fun main(args: Array<String>) {
    val p = Person()
    //kotlin.UninitializedPropertyAccessException
    //lateinit property str has not been initialized
    println(p.getUpper())
}
复制代码

若想避免上述异常可以在使用属性前使用isInitialized方法判断。

open class Person {
    lateinit var str: String

    fun work() {
        if(::str.isInitialized) {
            println("str is isInitialized")
        } else {
            println("str is not isInitialized")
        }
    }
}
复制代码

getter/setter

默认情况下每个属性都具有getter/setter方法 声明一个属性的完整语法如下:

var <propertyName>[: <PropertyType>] [= <property_initializer>] 
    [<getter>]
    [<setter>]
复制代码

属性初始值、getter/setter是可缺省,如果属性类型可以从初始值或getter中推断出来则也可缺省。val类型的属性不具备setter。







请到「今天看啥」查看全文