java中传值与传地址

来源:互联网 发布:音频剪辑合成软件 mac 编辑:程序博客网 时间:2024/04/28 21:08

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的值

原创粉丝点击