日期:2014-05-20  浏览次数:20675 次

java的值传递与传引用
public class Pass {

 String a;

public static void test(Pass s){
s.a="av";

}
public static void main(String[] args) {
Pass s=new Pass();
s.a="222";
test(s);
System.out.println(s.a);
}

}
打印出来的是   av
Pass a是传引用
但是代码改成这样
public class Pass {

 String a;

public static void test(Pass s){
s=null;

}
public static void main(String[] args) {
Pass s=new Pass();
System.out.println(s);
test(s);
System.out.println(s);
}

}
打印的是
testString.Pass@6d8dfef8
testString.Pass@6d8dfef8
是一样的,这个是为什么?

------解决方案--------------------
打印出来的结果可以肯定是没有问题的
1,你在调用test方法的外面有一个引用s,打印它,这个首先可以明确没问题吧
2,test方法里面的s,是另外一个引用,只不过和方法外的s指向同一个对象。
3,然后test里面的引用s被指向null,而方法外面的s没有受任何影响,仍然指向前面new出来的对象。

前后两种写法不一样的原因是:
第一种写法的test方法里面,你通过引用操作了对象,修改了对象:
                s.a = "av"
第二章写法的test方法里面,你并没有通过引用操作对象,而是直接将引用指向了另外一个对象(这里是null),所以在这里你并没有改变原对象。当然你更不可能改变另外一个引用仍然指向原对象。
------解决方案--------------------
调用方法test(Pass s)时,这个方法里建了一个Pass类变量 s,这个s的值与你传的那个s 是一样的,都指向这个对象的地址。 对这个变量的别的操作(非赋值)都是对同一个对象的操作,而你只要对这个变量赋值,这时这个方法里的s就与外面的那个s没有任何关系了。