美文网首页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函数参数是拷贝传递还是引用传递

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

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

  • 读书笔记17.06.02【stack】【vector】

    C++中参数传递:按值传递,指针传递和引用传递按值传递:形参是实参的拷贝。指针传递:拷贝指针,被调用函数对指针指向...

  • Java值传递

    “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值...

  • Python初学者笔记(八):函数参数的值传递和引用传递

    函数参数的值传递和引用传递 像我们最熟悉的 C 语言,再写函数参数的同时需要规定函数参数到底是值传递还是引用传递。...

  • JAVA是按值传递还是按引用传递

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用...

  • Go语言学习笔记(三)

    指针 Go的指针不能运算 参数传递 Go的参数传递是值传递(值传递:开辟新的空间,拷贝传递参数的值,引用传递:引用...

  • java 参数传递

    java中方法参数传递方式是按值传递。 如果参数是基本类型,传递的是基本类型的字面量值的拷贝。 如果参数是引用类型...

  • Python 进阶内容整理

    Python 之禅 参数传递是值传递还是引用传递 深拷贝与浅拷贝 垃圾回收机制 del 元类 (metaclass...

  • 【JAVA基础】函数知识

    1.函数参数传递方式 虽然java通过引用操作对象,所有的对象变量都是引用,然而,java不能通过引用传递方法参数...

网友评论

本文标题:Java函数参数是拷贝传递还是引用传递

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