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;