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

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

值传递


值传递有这样的特点:实际上传递进方法或者对象实例的是要传递内容(基础类型变量或者对象的引用)的副本,因此,在方法或者实例内部改变传递进来的值,对于外部是不可见的,并不会造成什么影响
对于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中的值传递是同一个概念。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,534评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • 今晚遇到一个问题,就是全局变量的局,死活不变 如图的效果 country 永远为 1 最近遇到个有趣的问题:“JS...
    茶艺瑶阅读 2,934评论 0 1
  • 参考:http://ifeve.com/stackoverflow-reference-or-value/http...
    ALEXIRC阅读 4,447评论 0 3
  • 夙昔美梦似繁花,娇欲滴,人如痴。 目含秋波频顾,中宵风露独立。 心潮涌彤云,暗布幽情,还君一蕊愁丝,离!离!离! ...
    灵魂刀手阅读 1,683评论 2 3