Java变量正在更改而未分配

时间:2018-11-08 18:06:06

标签: java

我不明白为什么变量initialCoordinates在变化。当我运行程序时,initialCoordinates会在每次循环后更改值。

int[] initialCoordinates = { 26, 0 };
int[] positions = { 1, 2, 3, 4 };
int[][] coordinates = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
for (int i = 0; i < 4; i++) {
    System.out.println("Initial: " + initialCoordinates[1]);
    coordinates[i] = initialCoordinates;
    coordinates[i][1] += positions[i];
}

3 个答案:

答案 0 :(得分:11)

在您的示例中,您将coordinates[i]设置为initialCoordinates

然后在下一行执行coordinates[i][1] = ...时,就是通过initialCoordinates间接访问coordinates[i]并更改initialCoordinates[1]的值时。

答案 1 :(得分:2)

正如Mark所说,您正在使用initialCoordinates变量访问coordinates,因为您是通过引用分配的。这意味着在coordinates [i]=initialCoordinates;之后,coordinates[i]将引用与initalCoordinates相同的内存地址,这样当一个更改时,另一个也会更改。

您可能想要做的是复制值,这将具有按值分配它的效果。您可以使用System.arraycopy(请参见this answer)进行操作。通过按值分配,您可以分配一个单独的内存块来保存coordinates[i]的值,该值将从initialCoordinates复制,而不是两个变量都指向内存中的同一对象。

int [] initialCoordinates = {26,0};
int [] positions={1,2,3,4};
int [][] coordinates = {{0,0},{0,0},{0,0},{0,0}};
for(int i=0;i<4;i++){
    System.out.println("Initial: "+initialCoordinates[1]);
    System.arraycopy(initialCoordinates, 0, coordinates[i], 0, initialCoordinates.length);
    coordinates [i][1]+=positions[i];
}

答案 2 :(得分:2)

我将尝试向您展示Java内存中大约发生了什么。

  • 首先,您在stack中创建实例,该实例指向heap中的对象

enter image description here

  • 然后您更改了coordinates[0]的指针,并且两个变量-initialCoordinatescoordinates[i]指向heap中的同一对象

  • 因此,当您更改coordinates[0]时,还更改了堆中的对象。 initialCoordinates也引用堆中的对象,因此intialCoordinates也被“更改”。.

enter image description here