为什么这个 void 方法没有像我预期的那样工作?
Why is this void method not working as I would expect?
假设实例化Given数组如下:
int[] 给定 = {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 方法只是做了一些事情,而不是像我期望的那样 "applied"。如果对此有启发性的解释,我将不胜感激。
这个问题已经回答了,谢谢!!!
我需要冷冻它。
Void 很简单 return 什么都没有。将 void 替换为 int[] 以获得预期结果。也替换
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;
}
在 given = new int[5];
中,您正在更改给定的局部变量指向的内容,而不是它过去指向的对象。 local 稍后超出范围。数组永远不会被修改。
您正在创建一个全新的数组,并将用于引用原始数组的变量分配给新数组。您正在修改新数组,并且永远不会触及旧数组。
适当的修复类似于以下内容:
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
}
显然,如果您打算在实际 类.
中使用此方法或类似方法,则您应该删除无关代码
int[]
等数组是引用类型。这意味着当您执行赋值 given = new int[5]
时,您正在链接 whatIsGoingOn()
中引用的数组,而不影响 change()
.
中引用的数组
要执行您想要的操作,您需要遍历数组并更改数组中的各个元素。
for(int i = 0; i < given.length; i++) {
given[i] = 0;
}
given[0] = 200;
因为函数whatIsGoingOn
的参数given
是按值传递的。
要在 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;
}
从
更改 whatIsGoingOn 方法的以下几行
given = new int[5];
given[0] = 200;
至
Arrays.fill(given,0);
given[0] = 200;
它仍然保留对原始数组的引用。不需要 return 任何东西。
假设实例化Given数组如下: int[] 给定 = {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 方法只是做了一些事情,而不是像我期望的那样 "applied"。如果对此有启发性的解释,我将不胜感激。
这个问题已经回答了,谢谢!!! 我需要冷冻它。
Void 很简单 return 什么都没有。将 void 替换为 int[] 以获得预期结果。也替换
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;
}
在 given = new int[5];
中,您正在更改给定的局部变量指向的内容,而不是它过去指向的对象。 local 稍后超出范围。数组永远不会被修改。
您正在创建一个全新的数组,并将用于引用原始数组的变量分配给新数组。您正在修改新数组,并且永远不会触及旧数组。
适当的修复类似于以下内容:
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
}
显然,如果您打算在实际 类.
中使用此方法或类似方法,则您应该删除无关代码int[]
等数组是引用类型。这意味着当您执行赋值 given = new int[5]
时,您正在链接 whatIsGoingOn()
中引用的数组,而不影响 change()
.
要执行您想要的操作,您需要遍历数组并更改数组中的各个元素。
for(int i = 0; i < given.length; i++) {
given[i] = 0;
}
given[0] = 200;
因为函数whatIsGoingOn
的参数given
是按值传递的。
要在 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;
}
从
更改 whatIsGoingOn 方法的以下几行given = new int[5];
given[0] = 200;
至
Arrays.fill(given,0);
given[0] = 200;
它仍然保留对原始数组的引用。不需要 return 任何东西。