一:声明属性
kotlin类中属性可以使用关键字var也可以使用val,使用一个属性只需要在类实例后引用即可
class B(var name:String, val age:Int){}
fun main(){
var b = B()
b.name
b.age
}
二:getter和setter
声明一个属性的完整语法
var <propertyName> [: <propertyType] [= <property_initializer>]
[<getter>]
[<setter>]
其中初始化器(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:可以检查变量是否已经初始化