当前位置: 首页 > 面试题库 >

编译器为自动装箱生成什么代码?

乜安志
2023-03-14
问题内容

当Java编译器将原语自动包装到包装类时,它在幕后生成什么代码?我想象它调用:

  • 包装器上的valueOf()方法
  • 包装器的构造函数
  • 还有其他魔术吗?

问题答案:

您可以使用该javap工具亲自查看。编译以下代码:

public class AutoboxingTest
{
    public static void main(String []args)
    {
        Integer a = 3;
        int b = a;
    }
}

编译和反汇编:

javac AutoboxingTest.java
javap -c AutoboxingTest

输出为:

Compiled from "AutoboxingTest.java"
public class AutoboxingTest extends java.lang.Object{
public AutoboxingTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_3
   1:   invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   4:   astore_1
   5:   aload_1
   6:   invokevirtual   #3; //Method java/lang/Integer.intValue:()I
   9:   istore_2
   10:  return

}

因此,如您所见,自动装箱将调用static方法Integer.valueOf(),而自动拆箱intValue()将在给定Integer对象上调用。没什么,真的-
只是语法糖。



 类似资料:
  • 问题内容: 自动装箱相当吓人。虽然我完全理解之间的差异和我不能不帮助有后续错误的地狱了我: 那打印 他们为什么这样做呢?这与缓存的Integer有关,但是如果是这种情况,为什么它们不只是缓存程序使用的所有Integer?或为什么JVM总是不自动取消装箱到原始状态? 打印false false或true true会更好。 编辑 我不同意旧代码的破坏。通过返回true,您已经破坏了代码。 通过在字节码

  • 问题内容: 当我执行以下操作时, -包含一个元素,它是一个。 -不编译(错误:构造函数未定义) -包含7个元素,它们是对象 这是代码: 问题: 编译器为什么不自动将to 中的元素装箱并创建一个?这是什么原因呢?是我的愚蠢还是其他原因? 问题答案: 区别在于本身是,而是对对象的引用数组。 方法采用某种类型的变量参数,没有上限。该方法的擦除为。这意味着它将接受从扩展的任何类型的可变数量的参数。 由于不

  • 任何Java程序员都知道,不能将int(或其他基元值)放入集合中。集合只能保存对象引用,因此您必须将基元值装箱到适当的包装类中(在int的情况下是整数)。当您将对象从集合中取出时,您将得到您放入的整数;如果您需要一个int,您必须使用intValue方法解压整数。所有这些打包和拆箱都是一种痛苦,会把你的代码弄得乱七八糟。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。 是否有其他方法将基本类型转

  • 至少在GCC中,如果我们提供生成汇编代码的选项,编译器会通过创建一个包含汇编代码的文件来服从。但是,当我们简单地运行命令而没有任何选项时,它不会在内部生成汇编代码吗? 如果是,那么为什么它需要首先生成一个汇编代码,然后将其翻译成机器语言?

  • 问题内容: 自动装箱是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换结果相反,则称为拆箱。 那么,为什么我们需要它?为什么要在Java中使用自动装箱和拆箱呢? 问题答案: 需要一些上下文来充分理解其背后的主要原因。 基元与类 Java中的原始变量包含值(整数,双精度浮点二进制数等)。由于这些