1."::"
表示类的引用,eg:
startActivity(Intent(this, MyFragmentActivity::class.java))
2.var、val、const
var:定义变量
val:定义常量(final修饰)
const:用于修饰val,const val与val不同的是,const val 修饰的变量相当于java中public static final ,val修饰的变量为private static final,并为该变量提供公共的public static get XX()方法
3.lazy、lateinit
适用于初始化时的延时加载,只有在调用的时候才会初始化
lazy 用于val,lazy 应用于单例模式(if-null-then-init-else-return),而且当且仅当变量被第一次调用的时候,委托方法才会执行,第二次调用只会返回结果
lateinit用于var,一般应用于生命周期函数中变量的初始化,避免了非空检查。但是如果你没有对其进行初始化,那么将报出未初始化的异常
4. ?、!!
"?"表示该值允许为null
"!!"表示该值不允许为null,否则将报空指针错误
5.data
data 用在class前面,表示当前类是数据类,将自动帮你实现getter/setter,equals(),hashCode(),copy()等函数
6. object、component object
object:相当于该类中的所有属性、方法都为静态方法,object类实例本身为单例,object也可以表示为一个匿名类,或不存在的对象。
btn.setOnClickListener(object :View.OnClickListener{
override fun onClick(v: View?) {
}
})
val newObj = object {
var x = "a"
var y = "b"
}
Log.d(tag, "x:${newObj.x}, y:${newObj.y}")
component object:相当于该代码块内的属性、方法为静态属性、方法
7.一些有趣的函数
let:获取当前调用者对象,并执行函数表达式。eg:
val b:String? = null
b?.let {
println(it)
}
在当前let函数表达式内,可以用it指代b,表示当b不为空时执行let函数表达式
apply:与let不同的地方是,返回当前调用者对象,eg:
b?.apply {
b.length
}.let { println(it) }
run:与apply不同的是,返回函数表达式中最后一个值,eg:
val b:String? = "b"
b?.run {
val c = "c"
c
}.let { println(it) }
with:与apply类似,但是是将值传入with函数参数中,eg:
with("d"){
length
}
8. 嵌套类和内部类
嵌套类:不持有外部类的引用,声明一个嵌套类:Outer.Nested()
内部类:持有外部类的引用,声明一个内部类:Outer().Nested()
9. opetator 重载操作符,比如重载kotlin默认的set、get方法
10. inline 内联函数,对于需要频繁调用的函数,会经常的进栈出栈,使用内联函数可以调高性能,内联函数并没有函数这个变量,所谓的函数名只是为了方便开发人员
11. out in 关键字
out 协变,相当于java中的? extends T
in 逆变,相当于java中的? super T
kotlin和java都支持使用时型变,不同的是kotlin还支持声明时型变。
个人为方便记忆,out 表示为通配符上界,只可读取(即不能使用set方法),不可写入。in 表示通配符下界,只可写入(只能set)不可读取