Java中原始类型的数组如何工作?

时间:2014-09-29 06:01:09

标签: java arrays

在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]中的两个成员是原始数据类型(但不是引用类型)。

我的问题:

  1. 为什么Java允许将对象分配给基本类型成员,如下所示?

    i[0] = new Integer(3); // object of type 'class Integer' getting assigned to i[0]
    

    我如何理解这一点?在计数器中,i[0]显示值3,但不显示对象地址。

  2. I中的class [I是什么?我的意思是,对于class C{};C[].class给出了class [LC 其中[表示“数组”,LC表示“C类实例”

5 个答案:

答案 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)

  1. Java希望您为数组的元素分配int,但是您传递Integer,因此int自动为Integer[]。 顺便说一句,当你创建一个System.out.println数组时,在执行Integer.toString时也会得到相同的结果,因为[只创建它的值的字符串,而不是& #34;对象地址"。
  2. 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)

编译器执行基元及其相应对象之间的转换,以方便程序员使用。