不正确理解Java括号数组?

时间:2017-05-23 14:59:50

标签: java arrays

我用Java编写插件,我想设置4个不同的Location对象。因为在学校(C ++)他们教我们使用[]而我喜欢它们(括号),我决定这样做。哦,小伙子,我错了(或者可能只是我的错误)我想出了这段代码:

Location[] pos = new Location[4]; //an array (I guess)
Location loc = e.getBlock().getLocation(); //to get the position of a block

然后我在for循环中设置它以像这样迭代它们:

for(int i = 0; i < 4; i++){
    pos[i] = loc;
}

但是!当我想要更改任何pos[x]变量时,所有这些变量都会发生变化。这可能与指针有关吗? 无论如何。我改变了我的代码,就像这样做

Location loc = e.getToBlock().getLocation();
Location loc1 = e.getToBlock().getLocation();
Location loc2 = e.getToBlock().getLocation();
Location loc3 = e.getToBlock().getLocation();

幸运的是,这段代码有效,但是我如何使用更多的变量,如果我想要200个像这样的东西怎么办?或者也许是一个dinamic“阵列”。 您可能想知道为什么我在引号中使用“数组”,但我真的不知道如何调用pos[]而不是数组,即使我知道数组存在并且它是完全不同的。

5 个答案:

答案 0 :(得分:2)

您必须在for循环的每次迭代中创建一个新的Location对象。

现在,您在所有阵列插槽中使用相同的对象。 'loc'变量是对堆中对象的引用,因此更改它会将更改传播到所有数组,

答案 1 :(得分:1)

它们都改变了,因为你将它们全部设置为同一个对象:你指定给loc的对象。如果你在循环中调用了e.getToBlock().getLocation(),那么你的4个数组元素将是不同的对象。

答案 2 :(得分:1)

现在,您的getLocation函数仅被调用一次,从而创建单个对象。在你的for循环中调用它。

for (int i = 0; i < 4; i++) {
    Location loc = e.getBlock().getLocation(); //to get the position of a block
    pos[i] = loc;
}

答案 3 :(得分:1)

  

当我想更改任何pos [x]变量时,所有这些变量都改变了

这是因为您将pos的每个元素分配给同一个对象。你来自C ++背景,所以你应该对指针有所了解。你正在做的是指定一个&#34;指针&#34;在pos的所有位置中的同一个对象。

  

如果我想要200个像这样的东西怎么办?

我不确定我是否理解你。您可以使用允许动态添加元素的ArrayList,这样您就不必提前知道其大小。请看the docs

答案 4 :(得分:1)

您是否打算为所有数组项分配相同的对象loc

如果是,我们走了。正如其他人建议的那样,每次进行循环时都应该调用函数e.getBlock().getLocation()。这为不同的对象提供了相同的值。

另一种解决方法是复制对象,而不是仅分配引用。 我对你的问题的看法是你正在混合复制和分配。将loc分配给循环中的数组项时

for(int i = 0; i < 4; i++){
pos[i] = loc;
}

您通过引用分配它,因为它是一个对象,而不是a primitive data type

这意味着在您分配loc后,数组项只有一个对内存位置的引用,当您通过任何引用更改其值时,所有其他引用将具有新值,即预期行为。

如果您打算将数组中的所有项目发送到loc,则应深入/浅层复制它,即不要通过引用分配它。请参阅此处获取解释on difference between copy and assignment。以下是deep copy using serialization

的答案