Java参数传递方式分为两种:值传递和引用传递
Java基本数据类型都是值传递方式,非基本数据类型(即引用类型,String除外,下面会详细介绍)是引用传递方式。
下面举例介绍:
1、基本数据类型及其包装类
public class testMain {
public static void main(String args[]){
float x=10;
System.out.println("改变前结果:"+x);
changeValue(x);
System.out.print("改变后结果:"+x);
}
public static void changeValue(float x){
x=12;
}
}
运行结果:
改变前结果:10.0
改变后结果:10.0
把float换成int等基本数据类型,或者其包装类Integer等,结果证明是一样的。
基本数据类型,作为参数传递时,只是简单的把自己的值copy了一下,传递过去,并不改变自身的值。
2、引用类型参数传递
public class testMain {
public static void main(String args[]){
String [] str = {"before"};
System.out.println("改变前结果:"+str[0]);
changeValue(str);
System.out.println("改变后结果:"+str[0]);
}
public static void changeValue(String [] temp){
temp[0]="change value";
}
}
运行结果:
改变前结果:before
改变后结果:change value
把参数改为其他引用类型对象,结果证明,参数值都会改变
引用类型对象,作为参数传递时,是把自己的引用地址传递了过去。当changevalue方法改变了该引用地址对应的值时,此数组对应的值也会发生改变。
3、String参数传递
public class testMain {
public static void main(String args[]){
String x="before";
System.out.println("改变前结果:" + x);
changeValue(x);
System.out.println("改变后结果:"+x);
}
public static void changeValue(String y){
y="after";
}
}
运行结果:
改变前结果:before
改变后结果:before
结果证明,String作为参数传递时,也是值传递。
原因如下:
1、String为不可变类型,原因参考String源码,String定义为final char[] 型
此处给出String源码:
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
value的定义为:
/** The value is used for character storage. */
private final char value[];
2、给String变量重新赋值后,实际上没有改变这个变量的值,而是重新new了一个String对象,改变了新对象的值,所以原来的String变量的值并没有改变。
这种解释呢,是说X最初指向before,Y也指向before,但是,当changeValue方法,改变y的值时,由于String的不可变性,
又新建了一个String对象,并把y指向after,所以,x的值并没有发生改变。