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.   

    打印出来的结果可以肯定是没有问题的
    1,你在调用test方法的外面有一个引用s,打印它,这个首先可以明确没问题吧
    2,test方法里面的s,是另外一个引用,只不过和方法外的s指向同一个对象。
    3,然后test里面的引用s被指向null,而方法外面的s没有受任何影响,仍然指向前面new出来的对象。前后两种写法不一样的原因是:
    第一种写法的test方法里面,你通过引用操作了对象,修改了对象:
                    s.a = "av"
    第二章写法的test方法里面,你并没有通过引用操作对象,而是直接将引用指向了另外一个对象(这里是null),所以在这里你并没有改变原对象。当然你更不可能改变另外一个引用仍然指向原对象。
      

  2.   

    调用方法test(Pass s)时,这个方法里建了一个Pass类变量 s,这个s的值与你传的那个s 是一样的,都指向这个对象的地址。 对这个变量的别的操作(非赋值)都是对同一个对象的操作,而你只要对这个变量赋值,这时这个方法里的s就与外面的那个s没有任何关系了。