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);
        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() 不会更改传递给它的数组。

关于java - 无法通过此 java 代码的输出找到答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26955829/

相关文章:

java - 从 Java 中的 PEM 格式文件中提取多个 X.509 证书

Java8 : Why is it forbidden to define a default method for a method from java. lang.Object

java - 为 XMLRootElement 命名

java - 我们是否可以自动配置和运行网络服务器?

java - Android幻灯片放映导致内存泄漏

java - R树库+如何运行

java - Network Service Discovery android教程报错: Service lost, Phone turns OFF

java - 在 TomCat 上部署 Jersey 代码后出现异常

java - 无法通过java应用程序连接到数据库mysql

java - 在 Java 中使用复杂类声明泛型变量