如何避免在数组(Java)中引用相同的索引?

时间:2012-12-31 01:24:24

标签: java arrays initialization element

我的Java数组存在问题。我在类中使用数组作为类字段,因为我没有实例化类,所以它们都是静态的。我这样调用一个数组(顺便说一下,这是一个对象数组,' Customer'是它自己的类):

 public static Customer[] cDatabase = new Customer[MAX_DATABASE];

其中MAX_DATABASE是表示最大条目数的常量。但是当我输入时会发生什么:

 className.cDatabase[0].firstName = "John";

(为了简单起见,避免使用方法) 调整该值,但数组中每个其他单元格中的每个firstName字段也会更改。我确信这与我调用数组的方式有关,但当我这样做时:

 for(int i = 0; i<className.MAX_DATABASE; i++){
      className.cDatabase[i] = new Customer();
 }

声明这样的字段后:

 public static Customer[] cDatabase;

但后来我得到了nullpointerexception。使这个数组正常工作的最佳方法是什么,因此元素不指向数组的相同索引? 我确定正确的答案也避免了NPE ...

3 个答案:

答案 0 :(得分:4)

你需要做两件事。创建一个新数组并将新对象放入该数组中。

public static Customer[] cDatabase = new Customer[MAX_DATABASE];
for(int i = 0; i<className.MAX_DATABASE; i++){
      className.cDatabase[i] = new Customer();
}

答案 1 :(得分:2)

确保您firstName课程中的static字段本身未被声明Customer,否则它只会保留一个可能的值。

class Customer {
  private String firstName;
  ...

}

一般而言,使用公共字段并不是一个好的设计。考虑使用getter&amp;这些领域的制定者。这同样适用于cDatabase数组字段本身。

答案 2 :(得分:2)

如果每个单元格的所有firstName都发生了变化,那么事情就可能是两个:

  • 您在firstName课程中将static声明为Customer,并忽略了表明您应该以静态方式访问它的警告
  • 您将同一个Customer实例分配给数组的所有元素

例如

Customer[] array = new Customer[MAX];
Customer c = new Customer();
for (int i = 0; i < MAX; ++i)
  array[i] = c;

此处数组的所有元素都指向相同的Customer,因此您始终可以修改并从每个单元格中获取相同的元素。

你应该做的是:

Customer[] array = new Customer[MAX];
for (int i = 0; i < MAX; ++i)
  array[i] = new Customer();

通过这种方式,您可以创建MAX Customer个不同的实例。修改一个不会影响其他人。