Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过引用传递变量与数组元素中的值_Java_Pass By Reference_Pass By Value - Fatal编程技术网

Java 通过引用传递变量与数组元素中的值

Java 通过引用传递变量与数组元素中的值,java,pass-by-reference,pass-by-value,Java,Pass By Reference,Pass By Value,我知道这个问题显然有很多重复的地方,比如和 但我的问题不同 考虑以下示例: 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(

我知道这个问题显然有很多重复的地方,比如和

但我的问题不同

考虑以下示例:

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);
    }
}
对于上述代码段:

a:1 b:2
开始时在test()中:1 2
在测试()结束时:2 1
a:1 b:2

这表明当我调用
test()
时,main()中
a
b
的原始值没有被交换,因此(如果我理解正确的话)意味着它是通过值传递的

现在,考虑下面的代码片段:

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]);
    }
}
对于此代码段,请执行以下操作:

2
2
20
20

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

有人能指出发生了什么事吗?为什么它表现出不同的行为


谢谢

我想您只是对阵列部分感到困惑

java中的数组是一个特殊的
对象
,包含对其他对象的引用。 您可以很好地更改这些“子”对象的值,就像更改任何对象一样

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

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


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

基本数据类型变量将按值传递。 对象数据类型变量将通过引用传递。
数组是对象数据类型,因此它将通过引用传递

所有数组都是通过引用传递的,默认情况下,变量是通过值传递的。如果你使用的是<代码>整数< /代码>,它的行为类似于C++背景。所以,如果有人从这个角度解释的话,对我会很有帮助。@Mitchel0022,好的,我明白你的意思了
Integer
作为变量或数组元素的数据类型,您的意思是?或者,
Integer
是一个对象,因此它将通过引用传递,在函数中更改它将永久更改它
int
只会在function@Mitchel0022可以总之,数组和对象是通过引用传递的;其他一切都是按价值计算的。集装箱呢?我认为引用(因为它们只包含对象)是错误的。请阅读规范的重复链接。这是一个微妙但非常重要的区别,因为在Java中只有原语和引用。一切都是按值传递的。@JimGarrison,那么数组呢?正如Mitchell0022在上面的评论中指出的,我认为它们是通过引用传递的,因为这解释了第二个代码片段的输出和观察结果。请你详细说明一下,帮助我理解好吗?