记录Kotlin 遇到的与Java 不一样的地方
1. Kotlin 所有类和方法默认都是 "final"
但是Kotlin 是没有final 关键字的(Java 中的"final" 关键字)
如果需要重写 类 或者 方法, 需要加上关键字 "open" 修饰, "abstract" 修饰的抽象类或者方法则不用。
同时可以加上protected 保护,例如 :
protected open fun show() {
//...
}
常量则使用 const val 修饰
2. 子类初始化父类定义的变量,可以在init{} 块中 初始化
abstract class A{
var tmpA: String ?=null
}
class B: A{
constructor()
init{
tmpA="Hello world"
}
}
但是在 子类的构造函数中,是无法使用父类定义的变量的。
一般的,在接口定义方法, 抽象基类定义变量,子类按需覆写方法和变量。
3. 回调方式
java 一般需要在被调用方(例如A)定义一个接口,并且提供设置接口实例的方法, 然后在调用方(例如B) 实现这个接口, 在B调用A 的时候,需要先设置接口实例(也可通过lamada 表达设置)
而kotlin 可以通过把 方法作为 参数 传递, 非常方便 , 注意 {} 表示方法体
例如 fun test1(accept: () -> Unit, reject: () -> Unit) {
accept()
.....
reject()
}
其中 accept /reject 表示方法名, : 表示后面的是参数列表 和 返回值, ()即为参数列表, Unit 表示返回值
fun test2 () {
test1( { test3()}}, {test4()})
}
fun test3(){ ....}
fun test4() {.....}
注: 方法引用 与 监听器绑定
参考 https://developer.android.com/topic/libraries/data-binding/expressions#java databinding 中的事件处理
- 方法引用:在表达式中,您可以引用符合监听器方法签名的方法。当表达式求值结果为方法引用时,数据绑定会将方法引用和所有者对象封装到监听器中,并在目标视图上设置该监听器。如果表达式的求值结果为
null
,则数据绑定不会创建监听器,而是设置null
监听器。 - 监听器绑定:这些是在事件发生时进行求值的 lambda 表达式。数据绑定始终会创建一个要在视图上设置的监听器。事件被分派后,监听器会对 lambda 表达式进行求值
(1) 方法引用:所有参数必须一致,以要调用的方法名称作为值
例如: handlers::onClickFriend
(2) 监听器绑定: 可以有参数,也可以没有参数
监听器绑定是在事件发生时运行的绑定表达式。
例如:
class Presenter { fun onCompletedChanged(task: Task, completed: Boolean){} }
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />