kotlin属性与字段

一:声明属性

kotlin类中属性可以使用关键字var也可以使用val,使用一个属性只需要在类实例后引用即可

class B(var name:String, val age:Int){}
fun main(){
  var b = B()
  b.name
  b.age
}

二:getter和setter

声明一个属性的完整语法
var [: ]
[]
[]
其中初始化器(initializer)、getter、setter都是可选的,属性类型如果可以从初始化器或者getter返回值中推断
出来也可以省略。
我们可以为属性自定义访问器get,每次访问该属性就会调用该get函数

val isEmpty : Boolean
    get() = this.size ==0
val isEmpty get() =this.size == 0   //isEmpth的类型由get的返回值类型自动判断

如果我们自定义了set,那么每次给属性赋值都会调用它

var name: String
    get() = this.toString
    set(value) {
        show(value)    //setter参数的默认函数一般是value,但如果你喜欢可以使用别的名字。这里一般做些别的操作
        field = value
    }

幕后字段

上个例子中最后只有实现了field=value才能被正确赋值,那么field是什么呢? 在kotlin中我们不能直接声明一个字段,当我们需要一个字段的时候kotlin会为我们自动提供,我们称之为幕后字段,幕后字段一般使用field标识符在访问器中使用,field只能使用在属性访问器中。

三:编译器常量

已知值的属性可以使用const修饰符标记为编译器常量,这些属性满足一下要求

  • 位于顶层或者是object声明,或companion object的一个成员
  • 以String或者原生类型初始化
  • 没有自定的getter

四:延迟初始化属性与变量

一般属性声明非空类型必须在构造函数中初始化,但是有时候我们并不想在类实例化时对变量进行初始化,这时我们需要使用kotlin修饰符lateinit来对属性进行延迟声明,这个修饰符其实就显式告诉编译器,这里不需要进行变量未初始化检查,后期需要程序员自行初始化。lateinit只能修饰object类型,无法修饰基础类型

lateinit var p: Person

isInitialized:可以检查变量是否已经初始化

你可能感兴趣的:(kotlin属性与字段)