java的传参是按值传参(我现在的理解)
1、基本数据类型作为变量(变量的复制品);
所以要改变要像c/c++那样可写一个可以交换基本类型变量值的函数在java中要费劲的多。
2、对象引用作为参数,其实传入的也只是对象的引用的复制品(不是对象的复制品),本质上还是按值传参,但是这些应用的复制品不管有多少个,总之还是指向同一个对象。除非你把它指向另外的对象或者置为null,否则你通过引用操纵对象成员一定能够改变对象的内容。假如大家不理解,可以看我下面的例子:
class Test
{
public static void main(String args[])
{
int val;
StringBuffer sb1, sb2;
val = 10;
sb1 = new StringBuffer("apples");
sb2 = new StringBuffer("pears");
System.out.println("val is " + val);
System.out.println("sb1 is " + sb1);
System.out.println("sb2 is " + sb2);
System.out.println("***********************");
System.out.println("calling modify");
//按值传递所有参数
modify(val, sb1, sb2);
System.out.println("returned from modify");
System.out.println("***********************");
System.out.println("val is " + val);
System.out.println("sb1 is " + sb1);
System.out.println("sb2 is " + sb2);
}
public static void modify(int a, StringBuffer r1,StringBuffer r2)
{
a = 0; //基本变量还是按值传递
r1 = r2; //引用一样是按值传递,其作用域是有限制的,不是把r2的地址给r1,赋予的只是一个引用变量。
r2.append(" taste good");//操纵原对象的值。
r1=r2;
System.out.println("方法中a is " + a);
System.out.println("方法中r1 is " + r1);
System.out.println("方法中r2 is " + r2);
}
}
结果:
val is 10
sb1 is apples
sb2 is pears
***********************
calling modify
方法中a is 0
方法中r1 is pears taste good
方法中r2 is pears taste good
returned from modify
***********************
val is 10
sb1 is apples
sb2 is pears taste good
3、要注意String类型以及所有的基本类型的Wrrapper类有特殊情况,他们的引用改变不了他们所指向的对象的值。因为他们是IMMUTABLE类。只有将改变后的对象作为返回值才能得到改变后的对象。