5

如果我有一个类说 A,并且我将这个类的 10 个元素的数组声明为,

A [] arr=new A[10];

然后创建 A 的 10 个新对象并将其存储在数组中。

但是,我希望能够在 的行上做一些事情A arr[10];,其中​​数组只保存对空对象的引用。

我需要这个的原因是因为我只需要数组来保存我稍后在代码中填写的实例。因此,上述语句创建的对象无论如何都会丢失,据我所知,对象创建是昂贵的。

那么,有没有什么方法可以让一组引用指向我以后想要的对象?或者这是不可能的,我应该求助于使用ArrayList?

4

4 回答 4

13

如果我有一个类说A,并且我声明这个类的 10 个元素的数组,

A [] arr=new A[10];

然后创建 A 的 10 个新对象并将其存储在数组中。

这是不正确的。在这里,创建了一个包含十个引用的数组,并且每个引用都设置为null. A此代码没有创建的实例。

换句话说,代码已经完全按照您的意愿去做了。

于 2013-02-25T10:08:21.030 回答
4

如果你这样做了,A [] arr=new A[10];那么除了你的数组之外不会创建任何对象,每个字段都将在null你初始化它之前。

A [] arr=new A[10];只创建存储A类对象引用的地方。虽然创建了数组arr,但它没有引用任何对象,你不能这样做 like 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()不会导致错误。

于 2013-02-25T10:08:23.397 回答
1

来自JLS 类型的变量:

数组组件是未命名的变量,每当创建一个新的数组对象(第 10 节,第 15.10 节)时,就会创建并初始化为默认值(第 4.12.5)。当不再引用数组时,数组组件实际上不再存在。

4.12.5 开始。变量的初始值

对于所有引用类型(第 4.3 节),默认值为null

所以正如你所说:

如果我有一个类说 A,并且我将这个类的 10 个元素的数组声明为,
A [] arr=new A[10];
然后创建 A 的 10 个新对象并将其存储在数组中。

这是不正确的。但你想要的是正确的。

那么,有没有什么方法可以让一组引用指向我以后想要的对象?

于 2013-02-25T10:19:45.620 回答
0

这是一个常见的 OOP 问题,可以使用Null Object设计模式来解决。

为了不必初始化n 个对象,您可以创建一个相同类型的静态对象,例如:

public class A {
  public static final A NULL = new A();
.
.
.
}

现在这个对象可以通过调用来充当你的空引用:


A[] arr = new A[10];
Arrays.fill(arr, A.NULL);

如果您想检查空值,.equals这也很方便地利用了。. hashCode

于 2021-09-24T03:22:51.617 回答