Can';我无法通过这段java代码的输出找到答案

Can';我无法通过这段java代码的输出找到答案,java,Java,有人能解释一下为什么这个代码的输出是这样的吗 0 40 0 40 public class Class extends Main { public static void main(String[] args) { int x = 0; int [] arr = {20}; f (x, arr); System.out.println(x + " " + arr[0]); g (x, arr);

有人能解释一下为什么这个代码的输出是这样的吗

0 40
0 40

public class Class extends Main {

    public static void main(String[] args) {
        int x = 0;
        int [] arr = {20};
        f (x, arr);
        System.out.println(x + " " + arr[0]);
        g (x, arr);
        System.out.println(x + " " + arr[0]);
    }

    public static void f(int x, int[] arr) {
        x += 30;
        arr[0] = 40;
    }

    public static void g(int x, int[] arr) {
        x = 50;
        arr = new int[] {60};
    }

}
我想应该是这样的:

0 20
0 20

数组是一个对象,所以当您将它传递给方法时,您就是在传递对该对象的引用。因此,方法调用可以更改数组中的元素,而更改的数组与传递给方法的数组相同。因此,
f()
的调用方可以看到这些更改

另一方面,当您将原语值传递给方法时,将创建变量的副本,并且该方法所做的任何更改都是该方法作用域的局部更改。当方法接收到包含对象引用的变量并尝试为其分配新引用时,也是如此。该赋值是该方法的局部赋值。这就是为什么
g()
不会更改传递给它的数组。

因此,在调用f()方法时,您将数组对象引用作为值传递给f方法,因此您可以访问[0],并且可以将其更改为您正在执行的任何值,因此得到30


现在,当您调用g()方法时,确实会再次将array对象的引用作为值传递,并且在内部尝试将新实例分配给array,这是完全有效的,您会看到该方法中预期的更改,但当您返回main时,您会看到相同的旧引用(请记住,我们将引用作为值传递,而不是原始对象的引用)因此,您最终将旧的40视为值。

在java中,数组是一个对象,对象是通过引用传递的,因此当您在方法中更改数组时,它也会影响实际数组。

还请注意,您是否使用静态环境并不重要,因为有些人不知道什么是静态的y的意思是。