更改方法中的变量值,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

一个变量通过引用传递,另一个是按值传递:)

传递参考与传递值之间有什么区别?