- var和val的区别
var是一个普通的变量,和java中声明变量的方式一样。
val是一个只读变量,相当于java中变量前使用了final修饰。 - lateinit和lazy
lateinit只用于var,而lazy只用于val
lateinit不能用在可控属性上和java的基本类型上,否则会报错
错误:lateinit var amount:Double - inline内联函数
调用一个方法是一个压栈和出栈的过程,调用方法时将栈指针压入方法栈,然后执行方法体,方法结束时栈指针出栈,这个压栈和出栈的过程会耗费资源,这个过程中传递形参也会耗费资源。
为什么需要inline
有些简单的方法会被频繁调用,什么叫简单的方法呢,举个例子:
fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}
这个check方法的方法中,不会将它的形参再传递给其他方法。我们调用一下check方法
check(l, {"我是lambda方法体"})//l是一个Lock对象
对于编译器来说,调用check方法就要将参数l和lambda表达式{“我是lambda方法体"}进行传递,还要将check方法进行压栈处理,这个过程就会耗费资源。
如果我们把check方法删除,直接执行check的方法体呢?这样做的效果和调用check方法是一样,但是代码看起来就太不好看了,而且也会出现代码冗余。于是就把它抽成了check方法,那么如上所述,一旦这个方法被频繁调用,压栈出栈将会带来性能问题。针对这个问题,kotlin引入了inline关键字。我们在check方法前加上inline,然后再调用check方法,编译器就会在编译期帮我们进行优化,将我们写的代码:
check(l, {"我是lambda方法体"})//l是一个Lock对象
换成
l.lock() try { return "我是lambda方法体" } finally { l.unlock() }
也就是说inline关键字实际上增加了代码量,但是提升了性能,而且增加的代码是在编译器执行的,对程序可读性不会造成影响。 - Kotlin中open,final,abstract修饰符
在Kotlin中,所有的类默认都是final的,如果你需要允许它可以被继承,那么你需要使用open声明:
//这个类具有open
属性,可以被其他类继承
open class People: Speakable{
//open
的方法被实现和覆写,该方法也是open
的
override fun say() {}
//final
属性的方法,不可被覆写
fun sayHello() {}
//open
属性的方法,可以被继承和覆写
open fun sayName() {}
}
当然,也可以阻止某些方法被复写:
open class People: Speakable{
//final
修饰一个原本具有open
属性的方法,使其变得不可再被覆写
final override fun say() {}
}
在Kotlin中,abstract的用法几乎和java一致,值得一提的是,当你使用abstract修饰符的时候,可以忽略open修饰符,因为被abstract修饰的类默认具有open属性。 - Kotlin中json生成Bean的插件JsonToKotlinClass
- Kotlin中用object修饰的类,被称之为静态类;使用“companion objet”修饰静态方法,可以使用类名.方法名的形式调用。
网友评论