无法找到这个java代码的输出

时间:2014-11-16 10:09:44

标签: 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

3 个答案:

答案 0 :(得分:1)

数组是一个对象,因此当您将其传递给方法时,您将传递对该对象的引用。因此,方法调用可以更改数组中的元素,并且更改的数组是传递给方法的相同数组。因此,f()的来电者会看到这些变化。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在java中,数组是一个对象,对象是通过引用传递的,所以当你在方法中对数组进行更改时,它也会影响实际的数组