更改方法中变量的值,Java

2022-09-04 00:52:38

我有一个关于在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);
    }
}

执行方法后,bird 的值不会更改 - 它仍然与值一起,即使在方法中我们更改了值Test.funk(bird, tiger)10funk()a = b[0] + 5;

另一方面,数组中元素的值会发生变化,因为我们有语句b[0] = b[0] * 2;

我不明白为什么一件事改变了,而另一件事没有?有人可以为我解释一下吗?


答案 1

看看 Jon Skeet 关于 Java 中的 Parameter-Passing 的文章,它解释了这一点。

简而言之(看看他的网站以获取更多全面的解释):

数组是引用类型。如果传递指向数组的引用,则会复制该引用的值并将其分配给函数的参数。因此,该参数将指向与传递的参数相同的数组。因此,通过函数参数对数组所做的更改将在调用函数中可见。但是,更改参数本身(b),例如通过将其设置为null,调用函数不会注意到,因为参数(b)只是传递的参数(tiger)的副本。

整数是所谓的基元类型。传递整数会复制其值并将其分配给参数。但该值不是对实际数据的引用,而是数据本身。因此,对函数中参数的更改将影响参数 (a),但不会影响调用函数中传递的参数 (bird)。


答案 2

基本上,对象(如数组)是“通过引用”传递到方法中的。因此,当您更改对象时,它会更改传递到方法中的同一对象。

基元(如 int)是“按值传递的”,因此在 a 中分配值的变量与传入的 int 变量不同。

我希望这有帮助...