Kotlin学习系列——Kotlin基本类型自动装箱的一点问题

墨蓝 2023-06-25 10:21 79阅读 0赞

问题

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

  1. val a: Int = 10000
  2. print(a === a) // Prints 'true'
  3. val boxedA: Int? = a
  4. val anotherBoxedA: Int? = a
  5. print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5

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

第一个栗子

  1. fun main(args: Array<String>) {
  2. test1()
  3. }
  4. fun test1() {
  5. val i: Int = 1000
  6. println(i)
  7. }
  8. 1
  9. 2
  10. 3
  11. 4
  12. 5
  13. 6
  14. 7
  15. 8

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

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

  1. public static final void test1() {
  2. short i = 1000;
  3. System.out.println(i);
  4. }
  5. 1
  6. 2
  7. 3
  8. 4

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

再举个栗子

  1. fun main(args: Array<String>) {
  2. test2()
  3. }
  4. fun test2() {
  5. val i: Int? = 1000
  6. println(i)
  7. }
  8. 1
  9. 2
  10. 3
  11. 4
  12. 5
  13. 6
  14. 7
  15. 8

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

  1. public static final void test2() {
  2. Integer i = Integer.valueOf(1000);
  3. System.out.println(i);
  4. }
  5. 1
  6. 2
  7. 3
  8. 4

分析

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

  1. fun test3() {
  2. //Kotlin并不会自动装箱
  3. val i: Int = 1000
  4. println(i)
  5. //因为j和k都被当做对象操作,因此会将i进行装箱做操,然后复制给j、k
  6. val j: Int? = i
  7. val k: Int? = i
  8. println(j === k)
  9. }
  10. 1
  11. 2
  12. 3
  13. 4
  14. 5
  15. 6
  16. 7
  17. 8
  18. 9
  19. 10
  20. 11
  21. 12

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

  1. public static final void test3() {
  2. short i = 1000;
  3. System.out.println(i);
  4. Integer j = Integer.valueOf(i);
  5. Integer k = Integer.valueOf(i);
  6. boolean var3 = j == k;
  7. System.out.println(var3);
  8. }
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5
  14. 6
  15. 7
  16. 8

总结

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

发表评论

表情:
评论列表 (有 0 条评论,79人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Kotlin 基本数据类型

    Kotlin中有以下几种常见的基本数据类型:数字、字符、布尔值、数组与字符串。 开始了解这些基本类型之前,我们首先的看一下在kotlin中是怎么申明一个变量的,有学习过js的