1,as 关键字的作用,表示强转类型,example 打开软键盘的代码
fun openKeyboard(context: Context, editText: EditText) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(editText, InputMethodManager.RESULT_SHOWN)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
解释:注意一点即可以观察出来,如果不进行强转,本身默认是 Object 类型,那么怎么会有 showSoftInput 方法和 toggleSoftInput 的方法呢。
2,object 关键字和 companion object 关键字都可以用来实现单例模式。不但如此,object 还常用来实现匿名内部类。
object 可以定义在全局也可以在类的内部使用
object 就是单例模式的化身
object 可以实现 Java 的匿名内部类
companion object 就是 Java 中的 static 变量
companion object 只能定义在对应的类中
tips:除此之外,除此之外,除此之外
object 可以作为变量的定义也可以是表达式
object 匿名类可以继承并超越 Java 中匿名类而实现多个接口
object 表达式当场实例化,但定义的 object 变量是延迟实例化的
object 匿名内部类还可以引用并更改局部变量
companion object 甚至还可以被扩展
object 可以实现 kotlin 的单例模式,可以定义在全局中,也可以定义在类的内部。但是需要注意:
1.object 定义后即刻实例化
2.因此 object 不能有定义构造函数
3.定义在类内部的 object 并不能访问类的成员
companion object 的定义完全属于类的本身,所以 companion object 肯定不能脱离类而定义在全局中。有些像 Java 中的 static 变量。也可以实现接口,因为 companion object 寄生于类,甚至类还可以直接作为相对应的接口的参数形式传入。
在 Java 中,内部类是不可以访问外部的非 final 成员变量的,也就是说:它不允许更改变量值!但是,kotlin 的 object 可以。
3,var 和 val 的唯一区别是 var 既有 getter 又有 setter,val 只有 getter 没有 setter。其中 val 与 Java 中的 final 不完全相同。只有一种情况他们完全相同,就是像 private val foo = 3 这样,以 private 修饰,赋予初始值,并且不提供自定义的 getter,不被委托的属性,这个属性完全等同于 Java 中的 private final int foo = 3。因为 kotlin 默认是 public 属性,如果是权限修饰符是 private 的话那么就不能外部访问,再加上是以 val 修饰的,所以没有 getter 和 setter 方法。
4,kotlin 中 open 关键字什么时候使用,init 关键字什么时候使用。
Kotlin 类默认是 final,这点可以自己尝试反编译下 Kotlin 代码就可以发现。所以如果你想扩展一个类的话,就必须使用 open 修饰符才行。
Kotlin 中的类可以有一个主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后
class Person constructor(firstName: String) {}
一般情况下 constructor 关键字可以省略。tips:主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,使用 init 关键字作为前缀。
class Person constructor(firstName: String) {
init {
System.out.print("FirstName is $firstName")
}
}
5,kotlin 代码转换成 Java 代码,选择 tools -> kotlin -> show kotlin bytecode (展示字节码文件)
-> Decompile 即可以显示出来相对应的 Java 代码。
6,注意在 kotlin 中之所以可以直接访问属性名来获取值就是因为 kotlin 自动生成了 getter 和 setter 方法。