如果我有一个班级说A,我将这个班级的10个元素的数组声明为
A [] arr=new A[10];
然后创建10个A的新对象并存储在数组中。
但是,我希望能够在A arr[10];
的行上做一些事情,其中数组只保存对空对象的引用。
我需要这个的原因是因为我只需要数组来保存我稍后在代码中填写的实例。所以上面语句创建的对象无论如何都会丢失,因为我理解对象创建是昂贵的。
那么,有没有办法只提供一个引用数组,我可以指向后面想要的对象?或者这是不可能的,我应该使用ArrayList
?
答案 0 :(得分:12)
如果我有一个班级说
A
,我宣布这个班级的10个元素的数组为,A [] arr=new A[10];
然后创建10个A的新对象并存储在数组中。
这不正确。在这里,创建了一个包含10个引用的数组,并且每个引用都设置为null
。此代码没有创建A
的实例。
换句话说,代码已经完全按照您的意愿执行。
答案 1 :(得分:4)
如果您执行A [] arr=new A[10];
,则除了您的数组之外,不会创建任何对象,每个字段都将为null
,直到您初始化它为止。
A [] arr=new A[10];
仅创建存储A
Class对象引用的位置。虽然已创建数组arr
但它没有引用任何对象,但您不能像arr[i].someMethod()
那样执行。
要纠正它,在数组中的单个内存中分配对象,如下所示:
A [] arr=new A[10];
arr[0] = new A();
arr[1] = new A();
:
:
或在循环中:
for(i=0; i<10; i++){
arr[i] = new A();
}
在arr
作为引用数组之后,引用有效的A类对象。在此表达式arr[i].someMethod()
之后不会导致错误。
答案 2 :(得分:1)
数组组件是未命名的变量,只要创建了一个新的数组对象(§4.12.5,§10),就会创建并初始化为默认值(§15.10)。当不再引用数组时,数组组件有效地停止存在。
来自4.12.5. Initial Values of Variables
对于所有引用类型(§4.3),默认值为 null 。
正如你所说:
如果我有一个班级说A,我宣布这个班级的10个元素的数组为, A [] arr = new A [10];
然后创建A的10个新对象并将其存储在数组中。
这不正确。但你想要的是正确的。
那么,有没有办法只提供一个参考数组,我可以指出我以后想要的对象?