Java 变量因未知原因更改值?

Java 变量因未知原因更改值?,java,Java,我可能知道这一点,但为什么这会将openPos[1]更改为0?我知道这与findCloseCurlBracket()方法中的startPos[1]=0有关,但它为什么要这样做呢?这没有意义 int[] openPos = {1, 26}; System.out.println(openPos[0]+", "+openPos[1]); int[] closePos = LuaTableParser.findCloseCurlBracket(stringList, openPos);

我可能知道这一点,但为什么这会将
openPos[1]
更改为0?我知道这与
findCloseCurlBracket()
方法中的
startPos[1]=0
有关,但它为什么要这样做呢?这没有意义

int[] openPos = {1, 26};
    System.out.println(openPos[0]+", "+openPos[1]);
    int[] closePos = LuaTableParser.findCloseCurlBracket(stringList, openPos);
    System.out.println(openPos[0]+", "+openPos[1]);
findCloseCurlBracket()方法:

public static int[]findclosecurl括号(列表文本,int[]openPos){
int[]startPos=openPos;
int计数器=1;
for(int line=startPos[0];line
startPos
指的是与
openPos
相同的数组:这两个东西都是对
int
s数组的引用

int[]startPos=openPos
是否深度复制
openPos

你的写作
startPos[1]=5
正在将调用方中引用的
openPos
所在的同一数组中的元素更改为
findCloseCurlBracket


获取深度拷贝的一种方法是编写
int[]startPos=openPos.clone()

因为
openPos
是对数组的引用(指向数组)。您正在将该引用(不是数组,而是对它的引用)复制到
findclosecurl-bracket
as
openPos
中。然后将该引用复制到
startPos
中,因此现在
openPos
变量、
openPos
参数和
startPos
变量都指向内存中的同一数组:

+-------------------+ | openPos variable |--+ +-------------------+ | | +-------------------+ | +-----------+ | openPos argument |--+---->| the array | +-------------------+ | +-----------+ | | 0: 1 | +-------------------+ | | 1: 26 | | startPos variable |--+ +-----------+ +-------------------+ …这将修改阵列:

+-------------------+ | openPos variable |--+ +-------------------+ | | +-------------------+ | +-----------+ | openPos argument |--+---->| the array | +-------------------+ | +-----------+ | | 0: 1 | +-------------------+ | | 1: 5 | | startPos variable |--+ +-----------+ +-------------------+
尝试克隆/复制阵列

int[] startPos = openPos; 

你在这里玩的是同一个引用。

好的,那么我必须复制数组的每个元素吗,或者如何复制数组?我喜欢高雅的ASCII艺术。这比我的答案要好得多。加上一个.Or
Arrays.copyOf(原件,新长度)->
数组.copyOf(openPos,openPos.length)不过我更喜欢“clone()”。举个例子,更容易记住。把它扔出去,展示一些选择
Arrays.copyOf
Arrays.copyOfRange
还可以复制数组的子集
clone()
将始终复制整个阵列
copyOf
更灵活一些。 +-------------------+ | openPos variable |--+ +-------------------+ | | +-------------------+ | +-----------+ | openPos argument |--+---->| the array | +-------------------+ | +-----------+ | | 0: 1 | +-------------------+ | | 1: 5 | | startPos variable |--+ +-----------+ +-------------------+
int[] startPos = openPos.clone();
int[] startPos = openPos;