属性修饰符
kotlin中,使用‘var’、‘val’来修饰属性,其中val修饰的是常量,相当于‘final’,var修饰变量,
一个属性必有这两个关键字其中一个来修饰
```
var s;
val s: Int = 0
```
属性命中规范:
java中通过 属性类型 属性名 = 属性值; 的方式来声明属性
String str = "chuan";
kotlin中则通过 属性修饰符 属性名: 属性类型 = 属性值的方式来声明属性
index: Int = 0
set/get函数
声明一个属性完整的语法是(以var为例):
var index: Int = 0
get() = this
set(intValue){
this = intValue
}
使用文字说明就是
属性修饰符 属性名称: 属性类型 = 属性初始值
get函数
set函数
其中 属性类型可以省略,当然是在可以根据属性初始值判断出属性类型的前提下
属性初始值以及set、get函数也可以省略
如下
var index1 = 0
var index2: Int
index2 = 0
var index3: Int = 0
最后再加上前面的那个表达式
var index4: Int = 0
get() = field
set(intValue){
field = intValue
}
其中field代表当前属性本身的值,且只能使用在访问器(个人觉得即set/get方法中)
前面几个表达式中少了这样一种命名方式:var index5: Int
有修饰符、属性名以及属性类型,但是没有属性值
当然我们可以使用 var index5: Int? = null ,但是这并不是我们当前小节所需要的,
我们需要的是没有等于号后面的乱七八糟的东西,接着往下看
延迟初始化属性与懒加载
对于上面的问题,我们可以使用lateinit
来解决
lateinit
意为延迟初始化,即在编译期检查时并不会因未初始化而报错,相应的,我们需要在引用之前进行初始化
lateinit var index: String
注意:
1、lateinit只能用来修饰对象,不能用来修饰基本类型,因为基本类型在类加载后都会有一个默认的初始值,
String既是基本类型又是数据类型
2、lateinit修饰的属性,只能是成员属性,即类属性
3、必须是var修饰且该属性没有自定义的get/set方法
与lateinit相对是懒加载by lazy
val str: String by lazy{
"str init by 'by lazy'"
}
{}
中的最后一行为返回值 即str的值为"str init by 'by lazy'"
by lazy懒加载即在第一次引用的时候才会进行初始化,(跟java内部类单例是不是有点相同的味道)在初始化过程中如果消耗大量资源时,会非常受用
这里说到了单例,就顺便写一下ktolin下的单例
public class Singleton private constructor() {
companion object {
val instance: = Singleton()
}
}
companion object 意为伴生对象,具体的我也不清楚,但是可以理解为java中的static关键字是没有错的,静态方法
companion object {
fun getCurrentVersion(): String {
return xxxx
}
}
关于private constructor
可以理解为是类的构造器,关于类的会在后面说到
空属性的创建
kotlin号称永不抛出空指针异常,相应的就需要我们对待空对象时有相应的处理
var str: String? = null
?
在这条语句中代表可为空 str?.toString()
中 str?
代表str不为空时会调用后面的函数,如果为空则不调用
网友评论