在java中,据说“除了原始类型之外的每一个实例都是一个对象。”
我试图使用下面的代码来理解这一点(第4行是具体的)。
public class dummy{
public static void main(String[] args){
int[] i = new int[2];
i[0] = new Integer(3); //line 4
i[1] = 3;
System.out.println(int[].class);
System.out.println(i[0]);
}
}
运行后
int[] i = new int[4];
Java正在创建[0,0]
类型的对象class [I
。此对象[0,0]
中的两个成员是原始数据类型(但不是引用类型)。
我的问题:
为什么Java允许将对象分配给基本类型成员,如下所示?
i[0] = new Integer(3); // object of type 'class Integer' getting assigned to i[0]
我如何理解这一点?在计数器中,i[0]
显示值3
,但不显示对象地址。
I
中的class [I
是什么?我的意思是,对于class C{};
,C[].class
给出了class [LC
其中[
表示“数组”,LC
表示“C类实例”
答案 0 :(得分:10)
i[0] = new Integer(3);
这涉及所谓的自动拆箱。在Java的黑暗时代(1.5之前版本),我们过去必须明确地选择基本类型和拆箱原型。但幸运的是语言设计师对我们可怜的手指表示同情,并添加了一些语法糖。它们现在让我们在原语和它们的包装类型之间自由转换。 Java秘密地将上述代码转换为:
i[0] = new Integer(3).intValue();
该自动拆箱。同样,它会为您提供价值,而无需您提出要求。如果你写:
Integer i = 5;
Java实际上会执行:
Integer i = Integer.valueOf(5);
class [I
中的我是什么?
I
的{{1}}。
答案 1 :(得分:3)
int
,但是您传递Integer
,因此int
自动为Integer[]
。
顺便说一句,当你创建一个System.out.println
数组时,在执行Integer.toString
时也会得到相同的结果,因为[
只创建它的值的字符串,而不是& #34;对象地址"。I
表示一维数组。 int
表示{{1}}。答案 2 :(得分:1)
java/lang/Integer.intValue:()I
时会调用 i[0] = new Integer(3); //line 4
,即编译器隐式获取Integer的int值并将其添加到数组中。
答案 3 :(得分:1)
对于您的第一个问题,Java autoboxes原始类型及其包装类(例如,int被包装到Integer类中),并且还取消了原始类型的包装器。
以下是文档:http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
答案 4 :(得分:1)
编译器执行基元及其相应对象之间的转换,以方便程序员使用。