解析Kotlin内部类

最近开始学习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在线编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值