我在理解以下示例中 Java 的“按值传递”操作时遇到问题:
public class Numbers {
static int[] s_ccc = {7};
static int[] t_ccc = {7};
public static void calculate(int[] b, int[] c) {
System.out.println("s_ccc[0] = " + s_ccc[0]); // 7
System.out.println("t_ccc[0] = " + t_ccc[0]); // 7
b[0] = b[0] + 9;
System.out.println("\nb[0] = " + b[0]); // 16
c = b;
System.out.println("c[0] = " + c[0] + "\n"); // 16
}
public static void main(String[] args) {
calculate(s_ccc, t_ccc);
System.out.println("s_ccc[0] = " + s_ccc[0]); // 16
System.out.println("t_ccc[0] = " + t_ccc[0]); // 7
}
}
我知道,因为 s_ccc 是一个引用变量,所以当我将其赋予方法calculate() 并对其在方法中的元素进行一些更改时,即使在我离开该方法后,这些更改仍然存在。我认为 t_ccc 也应该如此。又是
一个引用变量,我将其交给方法calculate(),并在该方法中将t_ccc的引用更改为s_ccc的引用。现在t_ccc应该是一个指向数组的引用变量,该数组有一个int类型的元素等于16。但是当方法calculate()离开时,t_ccc似乎指向它的旧对象。为什么会发生这种情况?改变不应该也保留吗?毕竟它是一个参考变量。
Regards
在前面的问题中对 Java 如何传递变量进行了深入讨论“Java是按引用传递吗?》。Java确实传递对象引用by value.
在您的代码中,数组(对象)的引用被传递到calculate()
。这些引用是按值传递的,这意味着对值的任何更改b
and c
仅在方法内可见(它们实际上只是s_ccc
and t_ccc
)。这就是为什么t_ccc
in main()
从未受到影响。
为了强化这个概念,一些程序员将方法参数声明为final
变量:
public static void calculate(final int[] b, final int[] c)
现在,编译器甚至不允许您更改b
or c
。当然,这样做的缺点是您无法再在您的方法中方便地操作它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)