【2023】Kotlin教程
第二篇 面向对象与函数式编程
第10章 面向对象编程
Kotlin语言目前还是以面向对象编程为主,函数式编程为辅。面向对象是Kotlin是重要的特性之一。
10.4 属性
属性是为了方便访问封装后的字段而设计的,属性本身并不存储数据,数据是存储在**支持字段(backing field)**中的。
【提示】Kotlin中属性可以在类中声明,称为成员属性。属性也可以在类之外,类似于顶层函数,称为顶层属性,事实上顶层属性就是全局变量。
10.4.5 惰性加载属性
实际开发中自己声明委托属性很少使用,而是通过使用Kotlin标准库中提供的一些委托属性,如:惰性加载属性和可观察属性。
惰性加载属性与延迟初始化属性类似,只有第一次访问该属性时才进行初始化。不同的是惰性加载属性使用的lazy函数声明委托属性,而延迟初始化属性lateinit关键字修饰属性。还有惰性加载属性必须是val的,而延迟初始化属性必须是var的。
举个栗子:
员工类:
open class Employee {
var no: Int = 0 // 员工编号属性
var firstName: String = "Tony"
var lastName: String = "Guan"
val fullName: String by lazy {
firstName + "." + lastName
}
lateinit var dept: Department
}
部门类:
class Department {
var no: Int = 0 // 部门编号属性
var name: String = "" // 部门名称属性
}
主函数:
fun main() {
val emp = Employee()
println(emp.fullName)
val dept = Department()
dept.no = 20
emp.dept = dept
println(emp.dept.no)
}
上述代码 val fullName: String by lazy { firstName + "." + lastName }
声明了的惰性加载属性fullName,by后面是Iazy函数,注意Iazy不是关键字,而是函数。Iazy函数后面跟着的是尾随Lambda表达式。惰性加载属性使用val声明。
代码lateinit var dept: Department
声明了延迟初始化属性dept,使用关键字lateinit。延迟初始化属性使用var声明。