美文网首页java干货程序员今日看点
Java函数参数是拷贝传递还是引用传递

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

作者: Vilarsail | 来源:发表于2016-07-14 16:29 被阅读357次

    初学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函数参数是拷贝传递还是引用传递

      本文链接:https://www.haomeiwen.com/subject/scwejttx.html