前言
五一小长假结束,正好赶上周末这周要上七天的班呀哈哈
声明属性
在kotlin类中的属性既可以使用关键在var 声明为可变,也可以用val关键字声明为只读
class Address {
var name: String = "栾桂明"
var street: String = "通达街"
var city: String = "哈尔滨"
var state:String? = "普通公民"
val age:Int = 25
}
要使用一个属性,只要用名称引用它即可,就像java中的字段:
fun copyAddress(address: Address): Address {
val result = Address()
result.name = address.name
result.city = address.city
result.state = address.state
result.street = address.street
return address
}
Getters与Setters
声明一个属性的完整语法是:
其初始化器,getter,setter都是可选的。属性的类型是可以从初始化器中推断出来的,也可以省略
// var allByDefault:Int? 错误:需要显示的初始化器,隐含默认 getter 和 setter
var initialized = 1 // 类 Int 默认 getter 和 setter
- 只读属性和可变属性的区别
一个只读属性的语法和一个可变属性的语法有两个方面的不同:1 只读属性用val代替var 2 只读属性没有setter
- 自定义访问器
我们可以为属性定义自定义的访问器。如果我们定义了一个自定义的getter,那么每次访问这个属性的时候都会调用它
// getter 的使用
val isEmpty get() = "xiaohei".isEmpty()
val name:String
get() = "name is xiaohei"
//setter方法的使用
var age:String
get()= "26"
set(value){
"栾小黑的年龄是 25"
}
// 测试使用的主函数
fun main(args: Array<String>) {
println(name)
println(age)
}
- 幕后字段
在kotlin类中不能直接声明字段,然而,当一个属性需要幕后字段的时候,kotlin 会自动提供。这个幕后字段可以使用 field标识符在访问器中应用:
var counter = 0
set(value){
if (value>0) field = value
}
fun main(args: Array<String>) {
counter = 12
println("setter方法的使用"+counter)
}
- 幕后属性
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
get() {
if (_table == null) {
_table = HashMap() // 类型参数已推断出
}
return _table ?: throw AssertionError("Set to null by another thread")
}
这里不是很懂
编译器常量
已知值的属性可以使用const修饰符标记为 编译器常量。这些属性要满足一下需求
- 一个位于顶层或者是object声明或者是companion object 的成员
- 以String或原声类型值初始化
- 没自定义的getter
const val XIAOHEI= “this is a handsome boy”
延迟初始化属性和变量
一般地,属性声明为非空类型必须在构造函数中初始化。 然而,这经常不方便。例如:属性可以通过依赖注入来初始化, 或者在单元测试的 setup 方法中初始化。 这种情况下,你不能在构造函数内提供一个非空初始器。 但你仍然想在类体中引用该属性时避免空检查
为处理这种情况,你可以用 lateinit 修饰符标记该属性:
lateinit var subject: TestSubject
该修饰符只能用于在类体中的属性(不是在主构造函数中声明的 var 属性,并且仅当该属性没有自定义 getter 或 setter 时),而自 Kotlin 1.2 起,也用于顶层属性与局部变量。该属性或变量必须为非空类型,并且不能是原生类型。
在初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实。
检测一个lateinit var 是否已经初始化
if (foo::bar.isInitialized) {
println(foo.bar)
}