java中传值与传地址一直是很多初学者容易困扰的问题,java中传值我们可以想像成将值copy到一个新的内存空间,换句话说就是系统将为目标对象重新开辟一个完全相同的内存空间。代码如下:
/**
* @author 陈龙
*/
public class PassValue {
public static void main(String[] args) {
int x = 5;
change(x);
System.out.println(x);//打印5
}
public static int change(int x) {
x = 3;
return x;
}
}
方法中的形参x是调用该方法才创建,把x赋值给形参,相当于创建了一个内存和原x相同的内存,故该方法运行后,形参x的确改变,但main方法中x不会受到影响,因为不属于同一块内存空间。
传地址:代码如下
/**
* @author 陈龙
*/
public class PassRef {
int x;
public static void main(String[] args) {
PassRef obj = new PassRef();
obj.x = 5;
change(obj);
System.out.println(obj.x);//打印3
}
public static void change(PassRef obj) {
obj.x = 3;
}
}
java中对象的传递是传地址。传地址相当于把地址号传递给另一个对象,这时,修改这个对象中的数据就会影响到原对象中的数据,因为他们都是指向同一块内存空间。同理,java中数组也是传地址的,代码如下:
int[] i = {1,2,3};
int[] j = i;
j[0]=0;
System.out.println(i[0]); //这时改变j的值也会影响到i的值,所以打印i[0]的值也为0,如果想不影响原值,可以使用System中arraycopy方法
但String这个对象有些特殊,代码如下:
public static void main(String[] args) {
String x = "abc";
change(x);
System.out.println(x); //打印"abc"
}
public static String change(String x) {
x = "123";
return x;
}
结果是"abc",我们知道Stirng这个类是一个final类,是不可修改的.将"abc"传递给方法形参x时,实际上和基本数据类型传递一样,是传递的值,也就是说形参x实际上是重新创建了一个块新的内存块(可参考String源码)。所以这两个Sting的x不属于同一块内存空间,则改变形参x后不会影响原来x的值