最近在写代码的过程中,逐渐体会到模块化、对象化、结构化、独立化对于整个项目工程是多么重要和迫切的一件事。
保持逻辑的清晰,保证各个模块灵活可拆卸,提升工程的解耦能力,拒绝臃肿,避免模块内部的强关联,真的很优雅。
结构构成了系统的骨骼,数据在不同对象,不同组件,不同模块之间传递,像血液一样流动起来,这样系统才能活动起来。然而,不同的编程语言之间,对于数据的传递也有这自己的方式,对于开发者而言可能就会造成疑惑。查了一些资料,下面我想总结一下。
值传递
值传递有这样的特点:实际上传递进方法或者对象实例的是要传递内容(基础类型变量或者对象的引用)的副本,因此,在方法或者实例内部改变传递进来的值,对于外部是不可见的,并不会造成什么影响
对于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中的值传递是同一个概念。