gpt4 book ai didi

java - 自动装箱究竟发生在什么时候?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:15 25 4
gpt4 key购买 nike

考虑以下玩具方法:

public Float testReturnFloat() {
return 2f;
}

以及以下客户端代码:

float resultOne = testReturnFloat();
Float resultTwo = testReturnFloat();

即使 Float testReturnFloat() 已被用作方法签名,现在这两个调用是否都涉及自动装箱,或者仅涉及后者?

小提示:这道题只是理论分析,是我差点把它写到生产代码中,因为错别字而遇到的。

最佳答案

testReturnFloat() 本身涉及自动装箱,因为原始 float 2f 在返回之前被隐式转换为 Float。现在当你写

float resultOne = testReturnFloat();

结果再次被拆箱以产生原始的float,然后分配给resultOne

当你写作时

Float resultTwo = testReturnFloat();

没有什么特别的事情发生。 testReturnFloat() 返回的 Float 被分配给 resultTwo


真正理解这一点的最好方法是查看字节码。这是 testReturnFloat() 的字节码:

  public java.lang.Float testReturnFloat();
Code:
0: fconst_2
1: invokestatic #57 // Method java/lang/Float.valueOf:(F)Ljava/lang/Float;
4: areturn

如您所见,Float.valueOf() 是在 2f (fconst_2) 上调用的。这就是我所说的自动装箱。

现在为您的客户端代码:

float resultOne = testReturnFloat();

成为

   0: invokestatic  #16                 // Method testReturnFloat:()Ljava/lang/Float;
3: invokevirtual #20 // Method java/lang/Float.floatValue:()F
6: fstore_1

请注意,拆箱是通过 Float#floatValue() 进行的。

最后,

Float resultTwo = testReturnFloat();

成为

   7: invokestatic  #16                 // Method testReturnFloat:()Ljava/lang/Float;
10: astore_2

正如我所说,没什么特别的; testReturnFloat() 的返回值只是存储在 resultTwo 中。

关于java - 自动装箱究竟发生在什么时候?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23784459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com