1、后期初始化与延迟初始化
* 1.1、后期初始化属性
声明后期初始化属性的特点:
- 使用lateinit关键字
- 必须是可读且可写的变量,即使用var声明的变量
- 不能声明于可空变量
- 不能声明于基本数据类型变量。例:Int、Float、Double等,注意:String类型是可以的
- 声明后,在使用该变量前必须赋值,不然会抛出UninitializedPropertyAccessException异常
//声明控件
private lateinit var mTablayout:Tablayout
//赋值
mTablayout = find(...)
//使用
...
* 1.2、延迟初始化属性
所谓延迟初始化即:指当程序在第一次使用到这个变量(属性)的时候在初始化。
声明延迟初始化属性的特点:
- 使用lazy{}高阶函数,不能用于类型推断。且该函数在变量的数据类型后面,用by链接。
- 必须是只读变量,即用val声明的变量。
// 声明一个延迟初始化的字符串数组变量
private val mTitles : Array<String> by lazy {
arrayOf(
ctx.getString(R.string.tab_title_android),
ctx.getString(R.string.tab_title_ios),
ctx.getString(R.string.tab_title_h5)
)
}
// 声明一个延迟初始化的字符串
private val mStr : String by lazy{
"我是延迟初始化字符串变量"
}
2、Kotlin之常量的用法
Kotlin中只用val修饰还不是常量,它只能是一个不能修改的变量。那么常量怎么定义呢?其实很简单,在val关键字前面加上const关键字。
即:
const val NUM_A = 6
其特点:const只能修饰val,不能修饰var
声明常量的三种正确方式
- 在顶层声明
- 在object修饰的类中声明,在kotlin中称为对象声明,它相当于Java中一种形式的单例类
- 在伴生对象中声明
// 1. 顶层声明
const val NUM_A : String = "顶层声明"
// 2. 在object修饰的类中
object TestConst{
const val NUM_B = "object修饰的类中"
}
// 3. 伴生对象中
class TestClass{
companion object {
const val NUM_C = "伴生对象中声明"
}
}
fun main(args: Array<String>) {
println("NUM_A => $NUM_A")
println("NUM_B => ${TestConst.NUM_B}")
println("NUM_C => ${TestClass.NUM_C}")
}