最近开始学习Kotlin,看好kotlin,有不少语法糖啊,先在android平台站稳脚跟,然后慢慢向其他平台延伸
–
引言
最近在学Kotlin,在学习的过程中,越来越强烈的感觉到,要想掌握Kotlin的精髓,必须利用的Java的语言特性来加深理解,对于学习Kotlin的很多语法糖特性大有裨益!
这篇文章的重点有:
- Kotlin内部类的定义形式
- 编译class文件,理解内部类的实现
1.代码举栗子:
fun main(args: Array<String>) {
OuterClass.NormalClass().run()
OuterClass().InnerClass().run()
}
class OuterClass {
val data = "123"
fun doSomething() {
}
class NormalClass {
fun run() {
// doSomething()//compile error
}
}
inner class InnerClass {
fun run() {
doSomething()
data
}
}
}
代码如上,kotlin内部类有两种形式,区别在于是否使用inner修饰class,参考main函数中的方法调用我们可发现二者在作用域上也表现不同;
对于inner修饰的InnerClass可访问外部类OutClass成员,且在调用时显示new了外部类实例,可以理解为内部类的实例引用了外部类实例;而相较之下,未使用inner修饰的NormalClass,不可访问外部类成员,在调用run方法时也未创建外部类实例;
_2.编译为.class一观
在桌面上vim一个TestKotlin.kt文件,写入上述代码;
然后执行命令编译
$ kotlinc TestKotlin.kt
得到.class文件后,我们用jd-jui打开一探究竟
无法执行的请执行以下命令配置环境,然后重试第一步(PS:可能会下载几次都会失败,原因你懂的,如果实在不行,请自行搜索如何copy studio下的文件夹,因为我没试过这种方式..)
$ sudo port install kotlin
2.3 理解伴随对象实现
使用jd-jui打开后我们先看看入口,也就是main函数的编译后的代码:
可发现NormalClass的调用形式未变,而在创建InnerClass实例时同时创建并传入一个外部类OuterClass实例;
我们再看看OuterClass.class
我们可以发现:
- NormalClass是静态内部类的形式,故而无法直接访问外部类实例成员;
- InnerClass依赖外部类实例,实际上是构造函数中传入了OuterClass的实例,故而可直接访问外部类成员;
- val修饰的变量在编译后只有get方法,而var修饰的变量编译后有get和set方法,变量的访问也是通过get和set做到的,这样可以辅助理解kotlin重写set和get,当然java里也是一样的;
–
结语
从本文过程中我们理解了
- Kotlin内部类的不同定义形式
- Kotlin内部类实现
附注:
Kotlin的中文文档可以 戳这里
官方也支持 kotlin在线编程