我用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[]
而不是数组,即使我知道数组存在并且它是完全不同的。
答案 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