版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangjingao/article/details/88171910
java方法间传参问题
有些人会迷惑java方法传参的时候有时候会改变原来的值,有时候不会,这是为什么呢?其实这是要分很多种情况的:原始类型,引用类型,不可变类型,改变值,改变地址。
看一些简单的例子
不会影响的情况
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
因为int作为原始类型,传递的是值,也就是说到了函数中你只拿到了我的身份证上的信息,知道我是谁而已,你不能对我做任何改变,你已经是一个新的变量了,在这里吗做的任何更改对原来的值没有任何作用。
那String呢?也没有改变是为什么呢?这要从底层说起,String本身是一个不可变类,也就是说我给传输传递的是地址,也就是说你拿到了我的身份证,你拿到了,但是对于String,它被关键字final修饰了,每次的更改都是新生了一个String对象,也就是说你对我改地址上的值或者修改我的地址都会给你一个新的身份证,那已经不是我了,对我不受影响。同样也是不可变类的还有Integer也是。
会影响的情况和特殊情况
public static void main(String[] args) {
StringBuffer sbA = new StringBuffer("A");
StringBuffer sbB = new StringBuffer("B");
testStringBuffer(sbA,sbB);
System.out.println(sbA+" "+sbB);
}
private static void testStringBuffer (StringBuffer aa, StringBuffer bb) {
aa.append(bb); //修改值
bb = aa; //修改地址
// bb.append(aa);
}
运行结果:
AB B
这个时候,StringBuffer就是一个引用类型,并且还不是一个不可变类。那么为什么还会有特殊情况?
引用类型传递是地址,从sbA变量来看,函数拿到了我的身份证,当修改值的时候,也就是修改我的身份证信息,可以影响到原来的值,但是当你想换一个地址,换我的身份证时,那时候你做的操作就影响不到我了。
汇总
在java传值中,如果是原始类型(boolean,char,byte,short,int,long,float,double), 函数传参是传递的是值,这样一来,在函数里怎么做都不会影响原先的变量。除了这些,其余传的是地址,那么是地址的话,你在函数里面可以修改变量的值,但是一旦修改了地址,就和原先的变量没关系了,原先的变量就访问不到修改的内容了。其中String,Integer特殊,因为两者是不可变类,每一个修改值都是一个新的变量。