属性和 Java 类似, 可以是 var 或者 val, 可以加可见性修饰符。
声明属性的完整语法是:
var <propertyName>: <PropertyType> [= <property_initializer>]
[<getter>]
[<setter>]
var name: String
get() = field - 1
set(value) {
field = value -1
}
Kotlin 提供了一种自动的后端域变量, 可以通过 field 标识符来访问。
一般情况不会修改属性的 getter 和 setter, 使用默认实现就可以,如上的代码并不常用。常用的是修改可见性,如下示例:
var name: String
private set // 可见度为 private, 并使用默认实现
- 常量
如果属性值在编译期间就能确定, 则可以使用 const 修饰符,达到 Java 里面的 final static 常量的效果。
但是必须是顶级属性,或者 object 的成员,如:
const val DEBUG = true
class Hello {
companion object {
const val TAG = "hello"
}
}
- 延迟初始化属性
通常, 如果属性声明为非 null 数据类型, 那么属性值必须在构造器内初始化。这种情况带来一些不便,比如有些属性在setup()的时候初始化。这种情况,可以将属性声明为可空变量, 但是会带来 null 值检查。这种情况可以为属性添加lateinit
修饰。
class Hello {
private lateinit var persion: Persion
fun setup(persion: Persion) {
this.persion= persion
}
fun test() {
println(persion.name)
}
}
lateinit 只能用于 var 类属性, 属性类型必须是非 null 的, 而且不能是基本类型。lateinit 属性被初始化之前访问它, 会抛出一个特别的异常。
- 覆盖属性
和方法的覆盖类似,open 的 属性可以被覆盖,但是属性的类型需要一致。
open class Base {
open protected val x = 10
}
class Hello: Base() {
override var x = 12
}
val 可以修改成 var, 反过来不行。
参考
《Programming Kotlin》Stephen Samuel ,Stefan Bocutiu
《Kotlin in Action》Dmitry Jemerov,Svetlana Isakova
网友评论