Java函数参数是拷贝传递还是引用传递

初学Java遇到一个诧异的问题,Java函数的对象参数到底是拷贝传递还是引用传递,为了验证这个问题,写了以下的一个测试类:

class Employee
{
    private String name;
    public Employee(String s)
    {
        name = s;
    }
    public void setName(String s)
    {
        name = s;
    }
    public String getName()
    {
        return name;
    }
}

然后编写调用的主函数:

class testValue
{
    public static void main(String[] args)
    {
        Employee a = new Employee("Alice");
        Employee b = new Employee("Sam");
        Employee c = new Employee("Coca");
        swap(a, b);
        System.out.println(a.getName());
        System.out.println(b.getName());
        c = a;
        a = b;
        b = c;
        System.out.println(a.getName());
        System.out.println(b.getName());
        changeValue(a);
        System.out.println(a.getName());
    }
    public static void swap(Employee x, Employee y)
    {
        Employee temp = x;
        x = y;
        y = temp;
    }
    public static void changeValue(Employee x)
    {
        x.setName("HH");
    }
}

于是,神奇的事情发生了,以下是打印结果:

vilarsail@OptiPlex-9020:~/test$ java testValue
Alice
Sam
Sam
Alice
HH

由于以前C++思想比较重,所以想到:如果是引用传递的方式,那swap()以后应该是交换了的,但是打印的结果却没有交换,如果是拷贝的方式新生成一个对象,那么在调用changeValue()的时候就当然不会影响原先变量的值,但是事实却是改变了。。。偶槽。。。
查了许多资料以后得出结论,Java的确是拷贝方式传递参数的,然而,此拷贝却跟C++有本质的不同,C++拷贝时候会新建一个对象,成立新的数据块,但是Java却是更类似于C++的指针传递,在传递参数时候相当于拷贝了一个地址指针,因此,在swap()函数里面更改x变量指针指向的对象不会影响到原先的a变量,在changeValue()中由于a和x指向的是同一个对象因此a指向的私有数据的变化当然会影响到x。

哈哈哈,苦逼的C++转Java程序猿~~~

你可能感兴趣的:(Java函数参数是拷贝传递还是引用传递)