【问题标题】:Pass by reference versus value in variable versus array element [duplicate]通过引用传递与变量与数组元素中的值[重复]
【发布时间】:2018-05-25 02:13:11
【问题描述】:

我知道这个问题显然有很多重复项,例如 herehere

不过我的问题不同。

考虑以下示例:

public class MyClass {
    public static void test(int a, int b) {
        System.out.println("In test() at start: "+a+" "+b);
        int temp=a;
        a=b;
        b=temp;
        System.out.println("In test() at end: "+a+" "+b);
    }

    public static void main(String args[]) {
        int a=1, b=2;
        System.out.println("a: "+a+" b: "+b);

        test(a, b);
        System.out.println("a: "+a+" b: "+b);
    }
}

The output that I get对于上面的sn-p是:

a:1 b:2
在开始时的 test() 中:1 2
在最后的 test() 中:2 1
a: 1 b: 2

这表明当我调用 test() 时,main() 中 ab 的原始值没有被交换,因此暗示(如果我理解正确的话)它是按值传递

现在,考虑以下代码 sn-p:

public class MyClass {
    public static void test(int[] arr) {
        System.out.println(arr[2]);
        arr[2]=20;
        System.out.println(arr[2]);
    }

    public static void main(String args[]) {
        int[] arr={0,1,2,3,4,5};
        System.out.println(arr[2]);

        test(arr);
        System.out.println(arr[2]);
    }
}

The output that I get 这个代码 sn-p 是:

2
2
20
20

这表明arr[2] 的值在main() 的原始数组中发生了更改,从而表示(如果我理解正确的话)数组是通过引用传递的

有人可以指出发生了什么吗?为什么会表现出不同的行为?

谢谢!

【问题讨论】:

  • 所有数组都是通过引用传递的,默认情况下变量是按值传递的。如果你使用Integer,它的行为会类似
  • 我来自 C++ 背景。所以,如果有人从那个角度来解释,那对我会很有帮助。
  • @Mitchel0022,好的,明白了。 Integer 是变量或数组元素的数据类型,你的意思是?
  • 要么,Integer 是一个对象,因此它将通过引用传递,并且在函数中更改它会永久更改它。 int 只会改变函数的作用域
  • @Mitchel0022,好的。总而言之,数组和对象是通过引用传递的;其他一切都按价值计算。容器呢?我想再次引用(因为它们只包含对象)?

标签: java pass-by-reference pass-by-value


【解决方案1】:

我认为您只是对数组部分感到困惑。

java 中的数组是一个特殊的object,它包含对其他对象的引用。 您可以像使用任何对象一样更改那些“child”对象的值。

记住我为避免混淆而保留的这条经验法则:

你直接对对象做什么并不重要,重要的是你做什么 在里面做

这意味着如果您在任何子对象(或您的情况下的数组项)内部进行一些更改,您会在调用者中看到它的副作用

【讨论】:

    【解决方案2】:

    原始数据类型变量将按值传递。 对象数据类型变量将通过引用传递。 Array 是 Object 数据类型,因此它将通过引用传递。

    【讨论】:

    • 这是不正确的。请阅读规范的重复链接。这是一个微妙但非常重要的区别,因为在Java 中只有原语和引用。一切都是按值传递的。
    • @JimGarrison,那么阵列呢?正如 Mitchell0022 在上面的 cmets 中指出的那样,我认为它们是通过引用传递的,因为这解释了第二个代码 sn-p 的输出和观察。能否请您详细说明以帮助我理解?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多