解析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函数的编译后的代码:
可发现NormalClass的调用形式未变,而在创建InnerClass实例时同时创建并传入一个外部类OuterClass实例;
我们再看看OuterClass.class
我们可以发现:
- NormalClass是静态内部类的形式,故而无法直接访问外部类实例成员;
- InnerClass依赖外部类实例,实际上是构造函数中传入了OuterClass的实例,故而可直接访问外部类成员;
- val修饰的变量在编译后只有get方法,而var修饰的变量编译后有get和set方法,变量的访问也是通过get和set做到的,这样可以辅助理解kotlin重写set和get,当然java里也是一样的;
–
结语
从本文过程中我们理解了
- Kotlin内部类的不同定义形式
- Kotlin内部类实现
附注:
Kotlin的中文文档可以 戳这里
官方也支持 kotlin在线编程
阅读全文
0 0
- 解析Kotlin内部类
- Kotlin-内部类
- Kotlin之匿名内部类
- Kotlin编程之嵌套类,内部类,匿名内部类
- 内部类解析
- 内部类解析
- 解析内部类
- Kotlin object express 匿名内部类
- Kotlin学习之-5.9 内部类
- Kotlin Reference (十二) 内部类、枚举
- kotlin中实现匿名内部类
- Kotlin特殊类(枚举、内部类)
- Kotlin嵌套类和内部类
- Java内部类大解析
- Java 内部类原理解析
- Kotlin汇总5-内部类,枚举类,对象,代理
- Kotlin-16.嵌套类/内部类(Nested Classes/Inner classes)
- Kotlin学习笔记——内部类和嵌套类
- redis 无法远程连接
- Python 上升到第二位,GitHub 2017 开发者年度报告
- 还不会用正则?看Linux 中 grep 命令的 12 个实践例子
- system verilog MATLAB学习笔记
- PHP——$_REQUEST
- 解析Kotlin内部类
- 147. Insertion Sort List
- 微信小程序开发教程、小程序资讯、小程序demo合揖(10月16日更新)
- Nodejs连接服务器连接mysql数据库(带事务功能)
- 热门开源项目:Guns-后台管理系统
- 【UVa 253】Cube painting
- 为何大量网站不能抓取?爬虫突破封禁的6种常见方法
- c++11 yield
- OLED(128*64)SSD1306驱动学习总结