Java android传递值?

Java android传递值?,java,android,function,Java,Android,Function,我有点困惑,希望有人能解释一下这件事。我创建了一个函数,该函数从图像数组中删除水平线,并返回没有任何水平线的图像数组。但是当我用图像数组调用这个函数时,它也会直接修改我传递给它的图像数组。为什么会发生这种情况 例子 imageArray的行是否仍然正确 如果有人好奇,这就是实际的功能: public int[][] RemovedLines(int[][] _baseImage) { int width = _baseImage[0].length, height = _baseImag

我有点困惑,希望有人能解释一下这件事。我创建了一个函数,该函数从图像数组中删除水平线,并返回没有任何水平线的图像数组。但是当我用图像数组调用这个函数时,它也会直接修改我传递给它的图像数组。为什么会发生这种情况

例子
imageArray
的行是否仍然正确

如果有人好奇,这就是实际的功能:

public int[][] RemovedLines(int[][] _baseImage)
{
    int width = _baseImage[0].length, height = _baseImage.length;   
    
    int white = 0;
    int black = 0;
    
    for (int y = 0; y < height; y++) {
        white = 0;
        black = 0;
        for (int x = 0; x < width; x++) {
            if(_baseImage[y][x] == 0xFFFFFFFF){
                white++;
            }else{
                black++;
            }
        }
        if(black  > white)
        {
            // line detected fist time
            // now get height of line
            int _starts = y;
            _starts++;
            int _end = 0;
            
            for(; _starts < height; _starts++){
                white = 0;
                black = 0;
                for(int _x = 0; _x < width; _x++){
                    
                    if(_baseImage[_starts][_x] == 0xFFFFFFFF){
                        white++;
                    }else{
                        black++;
                    }
                }
                if(white > black){
                    // end of line height
                    _end = _starts;
                    _starts = y;
                    
                    break;
                }
            }
            white = 0;
            black = 0;
            for(;_starts < _end; _starts++){
                for(int line = 0; line < width; line++){
                    if(_baseImage[_starts-1][line] != 0xFF000000 
                        && _baseImage[_starts-2][line] != 0xFF000000
                        || _baseImage[_starts+1][line] != 0xFF000000 
                        && _baseImage[_starts+2][line] != 0xFF000000){
                        _baseImage[_starts][line] =0xFFFFFFFF;
                    }
                    
                }
            }
            y = _end;
        
        }
    }
    return _baseImage;
}
public int[][]删除的行(int[][]u baseImage)
{
int width=\u baseImage[0]。长度,高度=\u baseImage.length;
int-white=0;
int黑色=0;
对于(int y=0;y白色)
{
//第一次检测到线
//现在得到线的高度
int _=y;
_启动++;
int _end=0;
对于(;_开始<高度;_开始++){
白色=0;
黑色=0;
对于(int x=0;x黑色){
//行尾高度
_结束=_开始;
_开始=y;
打破
}
}
白色=0;
黑色=0;
对于(;_开始<_结束;_开始++){
用于(int line=0;line
java中的数组是对象。
这类似于传递指向数组的指针,但不是原始指针,而是它的副本。

您修改了数组的内容。
您必须在方法内创建一个新数组。 在该副本中,您可以删除行。

然后返回该副本。

在Java数组中是对象。将对象传递给方法时,传递给方法的值是其引用的副本。这会导致对对象的修改(作为参数传递给方法)被修改为对象的引用,从而改变对象


关于Java如何通过与原语和对象相关的值传递的最好描述之一是在Java Ranch上。正如其他人指出的,数组是对象,并且:

Java通过值传递对象作为引用

引述:

这意味着,当您输入方法
RemovedLines
时,
\u baseImage
是指向与
imageArray
相同对象的引用(两个不同的引用指向堆中的同一对象)

因此,第一步应该是创建原始数组的副本。以下是方法:

int[][] cloneArray = new int[_baseImage.length][];
for (int i = 0; i < cloneArray.length; i++) {
    cloneArray[i] = _baseImage[i].clone();
}
从这一点开始,
\u baseImage
内部的
移除行
将独立于主
图像数组
数组(每个引用将指向堆中的不同对象)

但请注意,这会让大多数Java开发人员想伤害您(这会让您想起SCJP/OCPJP考试的糟糕记忆)。
正如@AlexWien所指出的,推荐的方法是重构代码,重新处理
cloneArray
并返回它。

Java总是按引用传递。
“imageArray”应该仍然有正确的行?
。。。不创建新数组并修改它,以方便快速响应人员。我应该删除这个问题吗?@Ramyle实际上。@Ramyle:正如Pshemo所说,java总是按值传递。我更喜欢将其称为“传递值引用”。对象(数组是对象的一种类型)的值是数据所在的内存位置。因此,当传入对象时,如果修改内容(通过数组项分配或其他副作用),它将显示在调用者中。但是,如果将参数作为一个整体分配(即_baseImage=new int[][…),则更改仅为局部更改,因为调用者仍有指向原始内存位置的指针。
int[][] cloneArray = new int[_baseImage.length][];
for (int i = 0; i < cloneArray.length; i++) {
    cloneArray[i] = _baseImage[i].clone();
}
_baseImage = cloneArray;