我对是否需要进行数组初始化感到困惑......
对于此代码:
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];
时,我的“新”关键字做了什么?
答案 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
。