更改方法中的变量值,Java
我有一个关于在Java中更改方法中的变量值的问题。
这是我的代码:
public class Test { public static void funk(int a, int[] b) { b[0] = b[0] * 2; a = b[0] + 5; } public static void main(String[] args) { int bird = 10; int[] tiger = {7}; Test.funk(bird, tiger); } }
在执行方法Test.funk(bird, tiger)
,bird的值不会改变 – 它保留值10
,即使在funk()
方法中我们用a = b[0] + 5;
更改了值a = b[0] + 5;
另一方面,数组中元素的值会发生变化,因为我们有语句b[0] = b[0] * 2;
我不明白为什么一件事改变而另一件事没改变? 有人可以帮我解释一下。
看看Jon Skeet关于Java中参数传递的文章,它解释了这一点。
简而言之(请查看他的网站以获得更全面的解释):
数组是引用类型。 如果传递指向数组的引用,则复制引用的值并将其分配给函数的参数。 因此参数将指向与传递的参数相同的数组。 因此,通过函数参数对数组所做的更改将在调用函数中可见。 但是,更改参数本身(b),例如通过将其设置为null ,调用函数将不会注意到,因为参数(b)只是传递的参数(tiger)的副本。
整数是所谓的原始类型。 传递整数会复制其值并将其分配给参数。 但该值不是对实际数据的引用,而是数据本身。 因此,对函数中参数的更改将影响参数(a),但不会影响调用函数(bird)中传递的参数。
基本上,对象(如数组)通过“引用”传递给方法。 因此,当您更改对象时,它会更改传递给方法的同一对象。
基元(如int)是“按值传递”,因此您在a中赋值的变量与传入的int变量不同。
我希望这有帮助…
那是因为你宣布的时候
public static void funk(int a, int[] b)
变量a的范围仅是该方法。 然后,当您更改该值时,您只更改该方法中该变量的值。
关于b。 这是对在main中创建的同一个数组的新对象引用,这就是为什么值似乎发生了变化(更改的是下面的数组对象)
但试试这个:
public static void funk(int a, int[] b) { // create a new reference for b int[] c = new int[b.length]; c[0] = b[0]; b = c; // The same. b[0] = b[0] * 2; a = b[0] + 5; }
当你这样做时,老虎的价值也没有改变(只有在funk中创建的新数组c的内容)
您可以使用包装器通过ref模拟传递。 看这篇文章。
虽然我对此没有任何评论
编辑只是为了好玩:
我已修改您的代码以使用上面发布的包装器。
它看起来很奇怪,但看起来很有效。
// By ref simulated. public class Test { public static void funk(_ a, int[] b) { b[0] = b[0] * 2; as( b[0] + 5 ) ; } public static void main(String[] args) { _ bird = new _ (10); int[] tiger = {7}; Test.funk( bird , tiger ); System.out.println("bird = " + bird ); System.out.println("tiger = " + tiger[0] ); } }
打印
bird = 19 tiger = 14
:-S
一个变量通过引用传递,另一个是按值传递:)
传递参考与传递值之间有什么区别?