假设Given数组实例化如下: int [] given = {1,2,3,4,5};
这些方法应该更改数组并显示打印结果。
public int[] change(int[] given) {
out.println(Arrays.toString(given)); //before-changes
whatIsGoingOn(given); //make changes
out.println(Arrays.toString(given));//after changes
return given; //return the supposedly changed array
}
//Make changes:
public void whatIsGoingOn(int[] given) {
given = new int[5];
given[0] = 200;
}
我将问题归结为使用void方法,覆盖了给定的int []的原始值,但新的初始化和声明从未实现。
我希望数组为:
{200, 0, 0, 0, 0};
但是Java打印出来了:
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
但是在我在whatIsGoingOnMethod中返回一个新更改的数组的情况下,我得到了我想要的结果:
{1, 2, 3, 4, 5}
{200, 0, 0, 0, 0}
如果void方法只是做了一些事情而且它并没有像我希望的那样被“应用”。我很欣赏这个有启发性的解释。
这个问题已经得到了回答! 我需要冻结它。
答案 0 :(得分:3)
使用given = new int[5];
,您将更改指定的局部变量,而不是它用于指向的对象。本地后来超出了范围。该数组永远不会被修改。
您正在创建一个全新的数组,并将用于引用原始数据的变量分配给新数组。你修改了新阵列,从不接触旧阵列。
适当的解决方案类似于以下内容:
public static void main(String[] args)
{
int[] original = new int[5];//already allocating memory, initializing to default value, etc.
setFirstTo20(original);
System.out.println(original[0]);//still 20!
}
public static void setFirstTo20(int[] given)
{
for (int i : given)
System.out.println(i);//for debugging, before change
given[0] = 20;
for (int i : given)
System.out.println(i);//after change
//heres whats happening to you
given = new int[5];
given[0] = 40;
for (int i : given)
System.out.println(i);//show new changes to NEW array
}
如果你打算在实际的类中使用这个或类似的方法,显然你应该摆脱无关的代码。
答案 1 :(得分:2)
因为函数given
的参数whatIsGoingOn
是按值传递的。
要在void函数中更改它,您必须将其包装在如下对象中:
class ArrayRef {
public int[] array;
}
public int[] change(int[] given) {
out.println(Arrays.toString(given)); //before-changes
ArrayRef ref = new ArrayRef();
ref.array = given; //set a reference to the given array
whatIsGoingOn(ref); //make changes
given = ref.array; //get the changed array
out.println(Arrays.toString(given));//after changes
return given; //return the supposedly changed array
}
//Make changes:
public void whatIsGoingOn(ArrayRef ref) {
ref.array = new int[5];
ref.array[0] = 200;
}
答案 2 :(得分:1)
int[]
等数组是引用类型。这意味着当您执行作业given = new int[5]
时,您正在查找whatIsGoingOn()
中引用的数组,而不会影响change()
中引用的数组。
要执行您想要的操作,您需要遍历数组并更改数组中的各个元素。
for(int i = 0; i < given.length; i++) {
given[i] = 0;
}
given[0] = 200;
答案 3 :(得分:1)
从
更改whatIsGoingOn方法的以下行given = new int[5];
given[0] = 200;
到
Arrays.fill(given,0);
given[0] = 200;
它仍然保留对原始数组的引用。不需要返回任何内容。
答案 4 :(得分:0)
Void很简单就不会返回任何东西。用int []替换void以达到预期的效果。也替换
public void whatIsGoingOn(int[] given) {
given = new int[5];
given[0] = 200;
}
与
public int[] whatIsGoingOn(int[] given) {
given = new int[5];
given[0] = 200;
return given;
}
最终结果应为
public int[] change(int[] given) {
out.println(Arrays.toString(given)); //before-changes
given = whatIsGoingOn(given); //make changes
out.println(Arrays.toString(given));//after changes
return given; //return the supposedly changed array
}
//Make changes:
public int[] whatIsGoingOn(int[] given) {
given = new int[5];
given[0] = 200;
return given;
}