Java函数值传递性问题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class RefenceTranslation {
int val=0;
RefenceTranslation(int a){
this.val=a;
}
public static void test(RefenceTranslation r){
r=new RefenceTranslation(2);
}

public static void main(String[] main){
RefenceTranslation d=null;
test(d);
if(r!=null)
System.out.println(r.val);
System.out.println("null");
}
}

  以上例子只是改变了函数test中参数r的内存值,这块内存与d所在的内存并无直接联系。所以修改test函数的参数r的值不影响实际参数d的值。将引用参数作为实际参数传给形式参数时,实际参数和形式参数内容相同,即指向同一个对象。此时如果时改变引用所指的对象内容,那么推出函数时该对象内容将发生改变。

0%