0

@edit IT 工作,感谢您的回答:) 我想我的错误是当我认为

WORLD[i]=global.Values.CHUNKPATTERN();

只需获取右侧的对象,克隆其值,并将它们分配给左侧的部分,而事实证明它在两者之间建立了引用。再次感谢:)

我有简单的初学者/新手数组问题:

for(int i=0; i<global.Values.WORLDVOLUME(); i++)  
// global.Values.WORLDVOLUME() --> const, int. always the same.
{
WORLD[i]=global.Values.CHUNKPATTERN(); //to pre-define as 'zero only' object. Always the same. Const.
WORLD[i].chunknr=i+1;
}

System.out.println(WORLD[4].chunknr);

当然,我想要WORLD[0]chunknr 1,WORLD[4]chunnr 为 5 等等。

相反WORLD[i].chunknr=i+1; ,似乎更新了所有元素的 chunknr (不仅WORLD[i])。所以它看起来像WORLD[0].chunknr = WORLD[1].chunknr=global.Values.WORLDVOLUME()这里。任何人都知道如何绕过它?我相信有一个简单的解决方案......我是否正确理解了对象数组?

你可以喜欢(前提是你有类和构造函数)

Point POINTARRAY[]= new Point[10];
POINTARRAY[1].x=5
POINTARRAY[1].y=6
POINTARRAY[3].x=17
POINTARRAY[3].y=1

正确的?如何通过循环分配它?

4

4 回答 4

0

这条线是你的问题:

WORLD[i]=global.Values.CHUNKPATTERN();

这是WORLD[i]对 的引用global.Values.CHUNKPATTERN()这意味着它们都指向同一个对象!并且对于循环的每次迭代,您只是在创建对同一个全局对象的越来越多的引用。

有时这不是你想要的。在这种情况下,您需要复制该值,这可以通过多种方式完成,但在大多数情况下,您可以简单地克隆它。所有 Java 对象都支持一种clone()方法,尽管有时您需要重写它才能为您的类做正确的事情。

这意味着您应该将上面的行替换为:

WORLD[i]=(YourType)global.Values.CHUNKPATTERN().clone();

whereYourType是类的实际类型,因为您从发布的代码片段中省略了它。

希望有帮助!

于 2012-12-18T21:44:15.217 回答
0

我猜以下行总是返回相同的引用:

global.Values.CHUNKPATTERN();

所以不同的数组索引实际上指向同一个参考。这只是一个猜测,因为您没有告诉我们上述函数是如何工作的。

这是一个不同数组元素可以指向同一个实例的示例:

public class AClass{ 
  public int val = 0;

 }
AClass[] array = new AClass[2];
AClass classInstance = new AClass();
array[0] = classInstance;
array[1] = classInstance;

上面的代码实例化了一个 AClass 对象(classInstance),但是使用 2 个不同的数组元素来引用同一个实例:

System.out.println("array 1 value " + array[1].val ); // both element initialized to 0 so it prints 0
array[0].val = 15; // actually is classInstance.val to be modified, through the reference to it stored inside the first element of the array. 
System.out.println("array 1 value " + array[1].val ); // print 15

对于 POINT 示例的关注点,您可以这样使用 for 循环:

Point POINTARRAY[]= new Point[10];
for(int i = 0 ; i < POINTARRAY.length; ++i)
{
  POINTARRAY[1].x=...;
  POINTARRAY[1].y=...;

}
于 2012-12-18T21:38:58.290 回答
0

相反WORLD[i].chunknr=i+1;,似乎更新了所有元素的 chunknr。

WORLD[0]WORLD[1] 不同的对象吗?`WORLD[0] == WORLD[1]如果评估为真,它们没有什么不同。

你有:

WORLD[i]=global.Values.CHUNKPATTERN();

每次调用时都会CHUNKPATTERN创建一个对象吗?new

于 2012-12-18T21:39:10.030 回答
0

我打赌这个方法

WORLD[i]=global.Values.CHUNKPATTERN();

总是返回一个对象的相同实例,因此您在数组的每个插槽中都有对相同对象的引用。

随后

WORLD[i].chunknr=i+1;

您在每次迭代中更改chunknr同一对象的属性。你说

...似乎更新了所有元素的 chunknr

有点真实,因为所有元素都引用同一个实例。

您需要找到一种方法来global.Values.CHUNKPATTERN();每次都返回一个新对象。

于 2012-12-18T21:40:46.953 回答