程序传递参数有按值传递和引用调用两种,按值传递是将一个参数值复制成子程序的正式参数,子程序的参数的改变不影响它调用的参数;引用调用是参数的引用而不是参数值被传递给子程序,在子程序中,该引用用来访问调用中制定的实际参数,对子程序参数的改变将会影响被子程序调用的参数。
对于原始数据类型,参数传递是传值的,在方法中修改了参数值,方法调用结束后,那个变量的值并没有发生改变。也就是在参数传递的过程中,该变量的值在方法调用期间会复制给形参,因为形参是方法的局部变量,所以对形参做出的任何修改在调用结束后都不会影响该变量的值。
如果传递的是指向对象的引用,那么就会传递引用值。这就意味着,在方法调用期间,实参和形参都是该引用值所代表的对象的别名。
示例如下:
public static void main(String[] args) {
int val;
StringBuffer sb;
String str="ads";
val=10;
sb=new StringBuffer("pears");
System.out.println("val is"+val);
System.out.println("str is"+str);
System.out.println("sb is"+sb);
System.out.println("");
System.out.println("calling modify");
modify(val,str,sb);
System.out.println("return from modify");
System.out.println("");
System.out.println("val is"+val);
System.out.println("str is"+str);
System.out.println("sb is"+sb);
}
public static void modify(int a,String r1,StringBuffer r2){
System.out.println("in modify...");
a=0;
System.out.println();
r1="ddd";
r2.append("taste good");
r2=new StringBuffer("test");
System.out.println("a is"+a);
System.out.println("r1 is"+r1);
System.out.println("r2 is"+r2);
}
}
运行结果:
val is10
str isads
sb ispears
calling modify
in modify...
a is0
r1 isddd
r2 istest
return from modify
val is10
str isads
sb ispearstaste good
示例中,定义了原始数据变量val和两个对象引用变量str和sb,方法调用过程中,变量val将值传递给了形参,执行方法后,val并没有发生改变;
对象引用变量sb,传递的是一个对象的引用值,在方法调用期间,实参和形参都是指向一个对象的引用,所以当在方法调用过程中,对该对象的引用会导致对象的变化,这种变化在方法调用后也是存在的;
String并不是一个原始数据类型的变量,它在方法调用后没有发生变化,是由于String是特殊的对象,它不能被改写,String是一个支持非可变性的类,这种类的特点是状态固定(不存在任何修改对象的方法),在该对象的生存周期内,它的值是永远不变的(它是线程安全的)。