美文网首页
值传递、引用传递、共享传递

值传递、引用传递、共享传递

作者: 风雪围城 | 来源:发表于2017-07-27 01:28 被阅读0次

    最近在写代码的过程中,逐渐体会到模块化、对象化、结构化、独立化对于整个项目工程是多么重要和迫切的一件事。
    保持逻辑的清晰,保证各个模块灵活可拆卸,提升工程的解耦能力,拒绝臃肿,避免模块内部的强关联,真的很优雅。
    结构构成了系统的骨骼,数据在不同对象,不同组件,不同模块之间传递,像血液一样流动起来,这样系统才能活动起来。然而,不同的编程语言之间,对于数据的传递也有这自己的方式,对于开发者而言可能就会造成疑惑。查了一些资料,下面我想总结一下。

    值传递


    值传递有这样的特点:实际上传递进方法或者对象实例的是要传递内容(基础类型变量或者对象的引用)的副本,因此,在方法或者实例内部改变传递进来的值,对于外部是不可见的,并不会造成什么影响
    对于Java来说,从本质上来讲,所有的传递都是值传递

          public static void main(String [] args){
              Dog myDog = new Dog("Rover");      //---1
              foo(myDog);                                       //---2
          }
          public void foo(Dog someDog) {
            someDog.setName("Max");                     //---3
            someDog = new Dog("Fifi");                    //---4
            someDog.setName("Rowlf");                   //---5
          }
    

    说明

    myDog变量在内存中占有空间,这段空间中有指向一个Dog实例或者说Dog对象的指针。
    在传递过程中,myDog这个内存中的被拷贝然后传递到方法中,并赋值到someDog,此时myDog和someDog这两个内存空间的值都有指向同一个Dog实例,因此此时均可以修改Dog实例的属性。
    当给someDog赋值新的Dog对象,改变的只是someDog变量的值,也就是someDog所占内存空间的值,指向了一个新的Dog对象,对myDog并没有任何影响。

    引用传递


    引用传递的特点是:这里的引用,相当于一个别名,所以,传递到方法或者对象中,对该变量的修改在外部是可见的。就像在某个qq群中,名字叫张三,同一个qq号,现在又进了另外一个qq群,起名李四,然而,不管是张三还是李四,本质上来说,指向的是同一个qq号。
    在C++中存在引用传递。不太熟悉C++,这里不细说。

    共享传递(Call by sharing)


    在JavaScript中看到这个概念。
    维基百科上说:

    However, the term "call by sharing" is not in common use; the terminology is inconsistent across different sources. For example, in the Java community, they say that Java is call by value.

    可见,这跟java中的值传递是同一个概念。

    相关文章

      网友评论

          本文标题:值传递、引用传递、共享传递

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