Kotlin基本类型自动装箱一点问题剖析

所属分类: 软件编程 / Android 阅读数: 50
收藏 0 赞 0 分享

问题

在Kotlin官方文档介绍基本类型时,给我们说明了在有些情况下会对基本类型自动进行装箱操作。 但是具体是如何进行装箱,以及何时进行装箱缺没有提供详细介绍。只是提供了一个例子,如下:

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

对于上述代码,废了好大力气 写了好多demo才搞清楚。 接下来先通过几个简单的栗子来理解一下Kotlin是如何进行装箱操作的

第一个栗子

fun main(args: Array<String>) {
 test1()
}

fun test1() {
 val i: Int = 1000
 println(i)
}

给大家提供一点技巧,在看不懂Kotlin是如何编译运行的情况下,我们可以先将其反编译成Java字节码,对于Java我们就驾轻就熟啦。具体做法就是

1 显示Kotlin的字节码

2将Kotlin字节码反编译成Java字节码

通过这种方法,将上面的test1()方法反编译之后得出如下字节码

public static final void test1() {
  short i = 1000;
  System.out.println(i);
 }

可以看出Kotlin编译器将 i 单纯的看做是一个基本类型short,并将其打印

再举个栗子

fun main(args: Array<String>) {
 test2()
}

fun test2() {
 val i: Int? = 1000
 println(i)
}

看到test1和test2的区别了吗?? 在test2中多了一个 ?
val i: Int? = 1000
这个“`?“`代表的意思是这个i可以被赋值为null, 既然可以是null,那就不能是原始类型,只能是对象,因此Kotlin会自动的为其进行装箱操作。因此反编译test2之后,我们会得到如下字节码

public static final void test2() {
  Integer i = Integer.valueOf(1000);
  System.out.println(i);
 }

分析

理解了上述两个小栗子之后,在回头看一下官方提供的demo,就可以理解了。我们不妨自己也写一个类似的代码

fun test3() {
 //Kotlin并不会自动装箱
 val i: Int = 1000

 println(i)

 //因为j和k都被当做对象操作,因此会将i进行装箱做操,然后复制给j、k
 val j: Int? = i
 val k: Int? = i

 println(j === k)
}

反编译成java字节码之后结果同我们猜想的一致:

public static final void test3() {
  short i = 1000;
  System.out.println(i);
  Integer j = Integer.valueOf(i);
  Integer k = Integer.valueOf(i);
  boolean var3 = j == k;
  System.out.println(var3);
}

总结

注:在Kotlin中,字符类型不是基本数值类型,是一个独立的数据类型。
上面的整形类型的表示方式并没有使用int、double等java中的关键字,而是使用了封装类来表示 这是因为在Kotlin中一切都是对象(没有如同java中的基本类型)。 当我们在代码中使用整形数字的时候,Kotlin会自动的将其进行装箱操作

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多