我想知道这段代码为什么以及如何工作。 原始类型不是扩展对象,那么为什么这有效呢?
public class Main
{
public static void main(String[] args) {
double rndValue = 232;
showObj(rndValue);
}
public static void showObj(Object obj)
{
System.out.printf(obj.toString());
}
}
请尽可能详细地解释这一点。提前感谢大家。
最佳答案
这是一个Java language feature叫boxing它允许原始类型与引用类型参数、变量或集合一起使用。编译器将生成正确的代码以在您的情况下获取1 java.lang.Integer
。
反汇编清楚地表明了这一点:
public static void main(java.lang.String[]);
Code:
0: ldc2_w #2 // double 232.0d
3: dstore_1
4: dload_1
5: invokestatic #4 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
8: invokestatic #5 // Method showObj:(Ljava/lang/Object;)V
11: return
在指令 5 处,编译器生成对 Double.valueOf(double)
的调用,该调用用于实际获取必要的对象。
1 使用单词“obtain”代替“construct”,因为对象可能会被缓存。由于不变性,这不是问题。
关于java - 为什么原始类型可以转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878180/