有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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) 个答案

  1. # 1 楼答案

    在版本“2”中,更改方法“不做任何事情”,因为您正在为a分配一个新数组,它是本地(参数)变量a。这对分配给main方法中声明的变量a的数组没有影响

    change()方法完成时,新数组超出范围,无法访问(因此指定用于垃圾收集)

  2. # 2 楼答案

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

  3. # 3 楼答案

    因为Java在方法之间通过值传递对象,而不是通过引用传递对象。在第一个示例中,您在main中实例化一个对象,并将其传递给change,后者只通过设置值来改变它。在第二个示例中,在已经在main中实例化了一次之后,实际上在change(使用new)中重新实例化了它。在change中重新实例化的char[]的作用域将是方法,只有这样,当您返回调用它的main时,它将恢复到自己的实例,而不是change在本地使用的实例

  4. # 4 楼答案

    这是因为你传递数据的方式。在第一个示例中,数组被更改,因为您正在向Change()方法传递数组的地址,而该方法正在更改地址中的数据

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

  5. # 5 楼答案

    首先,您正在更改传入并由“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引用的是一个新数组,而原始数组仍然引用原始数组

  6. # 6 楼答案

    有人打电话给我

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

    所发生的一切是,为方法的局部变量a分配了一个新的引用,这对仍然引用旧数组的主方法中的变量a没有任何影响