解析Kotlin内部类

来源:互联网 发布:地铁刷卡数据存闸机 编辑:程序博客网 时间:2024/06/05 18:40
最近开始学习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函数的编译后的代码:
内部类1

可发现NormalClass的调用形式未变,而在创建InnerClass实例时同时创建并传入一个外部类OuterClass实例;

我们再看看OuterClass.class
伴随对象2

我们可以发现:

  • NormalClass是静态内部类的形式,故而无法直接访问外部类实例成员;
  • InnerClass依赖外部类实例,实际上是构造函数中传入了OuterClass的实例,故而可直接访问外部类成员;
  • val修饰的变量在编译后只有get方法,而var修饰的变量编译后有get和set方法,变量的访问也是通过get和set做到的,这样可以辅助理解kotlin重写set和get,当然java里也是一样的;

结语

从本文过程中我们理解了

  • Kotlin内部类的不同定义形式
  • Kotlin内部类实现

附注:

Kotlin的中文文档可以 戳这里

官方也支持 kotlin在线编程

原创粉丝点击