java函数调用是平时较为频繁的操作,函数调用涉及到值的传递问题。java的值传递可分为两种:基本类型参数值传递和引用类型参数值传递。与c和c++有些类似,c语言中的值传递为基本类型参数值和指针类型值传递。
jvm会为函数分配一个栈,并在栈中为所有的方法参数分配相应的内存空间。所以在调用函数时,不管传递的参数是基本类型还是引用类型,虚拟机都会在函数栈中分配内存空间,并见实际参数值传递给方法参数,及将实际参数的内存内容copy到其对应的形式参数在函数栈中的内存空间中。所以改变形式参数值,即改变在函数栈中的内存空间的内容并不影响实际参数的值。这也说明,为什么将实际参数传递给形式参数,函数内部改变形式参数的值,在退出函数时实际参数值没有变化。
引用类型参数作为实参传递给形式参数时,在函数栈分配内存空间,并将实参内存的内容copy到该空间中。所以如果改变引用类型参数的值,不会造成对实际参数的影响。如下面的例子:
1 | public class RefenceTranslation { |
以上例子只是改变了函数test中参数r的内存值,这块内存与d所在的内存并无直接联系。所以修改test函数的参数r的值不影响实际参数d的值。将引用参数作为实际参数传给形式参数时,实际参数和形式参数内容相同,即指向同一个对象。此时如果时改变引用所指的对象内容,那么推出函数时该对象内容将发生改变。