java方法传参的时候有时候会改变原来的值,有时候不会,是因为它分很多种情况的:原始类型,引用类型,不可变类型,改变值,改变地址。
1.原始类型
public static void main(String[] args) {
//对String的判断
String a = "A";
String b = "B";
testString(a,b);
System.out.println(a+" "+b);
//对int的判断
int aInt = 1;
int bInt = 2;
testInt(aInt, bInt);
System.out.println(aInt+" "+bInt);
}
private static void testString (String aa, String bb) {
aa = "AA"; //改变值
bb = "BB";//改变地址
}
private static void testInt(int aInt, int bInt) {
aInt += 1; //改变值
bInt = aInt; //改变地址
}
}
运行结果:
A B
1 2
2.引用类型,改变值
运行结果:
new value
3.引用类型,改变地址
运行结果:
initial value
Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 如果参数类型是原始类型(boolean,char,byte,short,int,long,float,double),那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。一旦修改了地址,就和原先的变量没关系了,原先的变量就访问不到修改的内容了。 其中String,Integer特殊,因为两者是不可变类,每一个修改值都是一个新的变量。