为什么这两个java程序的输出不同

时间:2013-02-09 01:28:42

标签: java methods

public class Test {

    public static void change(char[] a){
        a[0] = '1';
        a[1] = '2';
    }

    public static void main(String args[]){
        char[] a = new char[]{'a','b'};

        change(a);

        System.out.println(a);
    }

}

输出为12

public class Test {

    public static void change(char[] a){
        a = new char[]{'1','2'};
    }

    public static void main(String args[]){
        char[] a = new char[]{'a','b'};

        change(a);

        System.out.println(a);
    }

}

输出为ab。我理解我错过了一些关于java传递方法参数的方法。我理解对象的引用是按值传递的。但是,我无法将我理解的内容与这些程序的结果相协调。

6 个答案:

答案 0 :(得分:8)

在版本“2”中,更改方法“不执行任何操作”,因为您要将新数组分配给a,即本地(参数)变量 {{1 }}。这对分配给main方法中声明的变量a的数组没有影响。

a方法完成时,新数组超出范围且无法访问(因此专门用于垃圾回收)。

答案 1 :(得分:4)

这是因为Java按值传递,而不是通过引用传递。在引用的情况下,您复制引用。您可以修改引用(版本1)后面的值,但不能修改引用本身(版本2)。

答案 2 :(得分:2)

致电

a = new char[]{'1','2'};

所有发生的事情都是为方法本地的变量a分配了一个新引用,这对主方法中仍然引用旧数组的变量a没有任何影响。

答案 3 :(得分:1)

第一个,您正在更改传入的数组并由'a'

引用

第二个,您正在更改'a'

引用的数组

有效地,你正在做的第二个

char[] original = new char[]{'a','b'};
// this is basically what your function call is doing from here....
char[] a = original;      // a is now also referencing the ab array
a = new char[]{'1','2'};  // now a is referencing a 1 2 array.
// then the function returns....and original is the same still

所以a引用一个新数组,而原始引用原始数组

答案 4 :(得分:1)

由于您传递数据的方式,这种情况正在发生。在第一个示例中,数组已更改,因为您正在传递Change()方法数组的地址,并且该方法正在更改地址中的数据。

在第二个示例中,数组IS已传递,但是您正在初始化一个新数组,该数组声明新的内存空间并更改传入的地址。但是,这不会删除char []的原始声明和初始化实例。在main方法中,当你打印出来时,它打印出本地char []而不是你试图创建的新char。

答案 5 :(得分:1)

因为Java在方法按值不按引用之间传递对象。在第一个示例中,您在main中实例化一个对象并将其传递给changechange仅通过设置值来更改它。在第二个示例中,您实际上已经在main中实例化了new(使用char[])后实际重新实例化它。 change中重新实例化change的范围将只是方法,因此当您返回调用它的main时,它将恢复为自己的实例,而不是{{1本地使用的实例}}

相关问题