为什么 Java 中只有值传递?
首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式。
这段话看起来比较绕,什么值传递,什么引用调用,在java中不必关心这些,理解下面这段话就好了:
Java方法得到的是所有参数值的一个拷贝
对于不论是基本数据类型,还是引用类型的变量,在传递给方法的时候,都会拷贝一份,注意,这里的拷贝是所谓的浅拷贝,意味着:
如果是基本数据类型,存的就是具体的值,如果在方法内部对参数的值进行了修改操作,那么影响的也只是拷贝之后的那部分内存,原来的变量所处的内存空间,是不会有任何改动的,即,值不会变;
如果是引用数据类型,浅拷贝出来后,方法内部的参数存的还是同一个对象的地址,这时对该参数进行更新等操作时,是直接更新该地址对应的对象,而原来的引用变量也同样不会有任何改动,即所指向的仍然一样的地址,换言之,所指向的对象还是同一个,对象的改动当然都是能同步访问到的。
其实上面两种情况是统一的:
拷贝所有参数,原参数对应的内存空间完全不变。(理解上是这样,但实际的物理内存是否改变暂不确定,比如GC等)
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。
其实上面的第一条和第三条说的是一个意思,就是参数的内存空间不变,即基本数据类型的值不变,引用类型引用的对象不变;
而第二条说的是对同一个引用对象可以进行更新操作。
本文深入探讨了Java中参数传递的机制,解释了为何Java只支持值传递,并详细阐述了基本数据类型和引用数据类型在方法调用过程中的行为差异。
1245

被折叠的 条评论
为什么被折叠?



