数组初始化:int与其他对象

时间:2013-09-24 16:12:00

标签: java android arrays

我对是否需要进行数组初始化感到困惑......

对于此代码:

private int[][][] rPos = new int[SIZE][SIZE][2];

我是否可以正确使用数组,如下所示?

getLocationOnScreen(rPos[i][j]); // pass an array of two integers

并且,对于此代码:

View[][] allViews = new View[SIZE][SIZE];

然后我必须创建另一个嵌套循环,并通过调用它们的构造函数来初始化每个View

for (int i = 0; i < SIZE; i++) {
    for (int j = 0; j < SIZE; j++) {
        allViews[i][j] = new View(ctor1, ctor2);
    }
}

我的问题是,为什么我不需要为整数数组执行此操作?还有,当我输入View[][] allViews = new View[SIZE][SIZE];时,我的“新”关键字做了什么?

1 个答案:

答案 0 :(得分:2)

  

为什么我不需要为整数数组执行此操作?

每当创建数组时,都会为数组元素分配该数组的组件类型的默认值。对于int,默认值为0,因此对于int[],默认情况下,所有元素都会初始化为0

但是,使用引用类型时,默认值为null。因此,当您尝试访问这些数组元素中的某些属性或方法时,这些数组的问题是,您可能会获得潜在的NullPointerException。基本上,对于引用数组,我们的意思是数组元素只是对实际对象的引用。最初他们没有指向任何对象。

因此,要访问任何属性或方法,必须将每个数组元素初始化为某个实例,以避免NPE

  

当我输入View[][] allViews = new View[SIZE][SIZE];时,我的“新”关键字做了什么?

它创建了一个类型为View的数组数组。维度为SIZE x SIZE。但由于View不是基本类型,而是引用类型。默认值为null,如前所述。

getLocationOnScreen(rPos[i][j]); // pass an array of two integers

当然你传递了一个包含2个整数的数组。 rPos[i][j]的组件类型为int[]。对于此,默认值为null。但在这种情况下,它不会是null,因为你已经给出了所有内部数组的维度。

如果您将阵列声明更改为:

private int[][][] rPos = new int[SIZE][SIZE][];  // Missing last dimension

然后rPos[i][j]的值为null