学过Java的同学都知道Java中函数的参数如果是Object对象的话,传的都是引用,但是下面的现象,让我对这点产生了一些怀疑.请大家帮我解惑
StringClass.java
public class StringClass {
    public String m_str;    public void changeStr(StringClass s){
        StringClass new1=new StringClass();
       new1.m_str="text1";
        s=new1;
        System.out.println(s.m_str);  //这里,传入的s.m_str已经改变
    }
}Main.java
public class Main {    public static void main(String[] args) {
        StringClass sc = new StringClass();
        sc.m_str="Hello";
        StringClass test = new StringClass();
        test.changeStr(sc);
        System.out.println(sc.m_str);   //这里,sc_的值又回归原始的值    }输出:text1
     Hello
请问这个怎么解释呢?

解决方案 »

  1.   

    StringClass new1=new StringClass(); 
          new1.m_str="text1"; 
            s=new1; 
    这里的s不再引用外边传进来的了啊.而是引用一个新的对象StringClass new1=new StringClass(); 这里创建的.
    你传一个实际参数到一个方法里去.外边的还是引用那个对象.方法的参数也引用这个(传进去的时候).但是后来在方法里,那个引用别的对象了.就不管外边传进来的了啊.
      

  2.   

    s=new1; 
    在这里,s已经不再引用外边的那个对象了.你可以改成这样试试:
     public void changeStr(StringClass s){ 
            System.out.println(s.m_str);  //先在这里打印一下
            StringClass new1=new StringClass(); 
            new1.m_str="text1"; 
            s=new1; //到这里了就不再引用传进来的对象了,而是引用刚创建的,所以下边的打印当然是打印出test1了
            System.out.println(s.m_str);  //这里,传入的s.m_str已经改变 
        } 
      

  3.   

    这个很好解释啊
    StringClass sc = new StringClass(); --构造了对象1
    sc.m_str="Hello";                    --对象1的变量赋值
    StringClass test = new StringClass(); --构造了对象2
            test.changeStr(sc){           --声明了局部引用变量s 令其指向对象1
                                     
    StringClass new1=new StringClass();   ---构造了对象3
          new1.m_str="text1";             ---对象3的变量赋值
            s=new1;                       ---局部变量s指向对象3
    }
            System.out.println(s.m_str);  --打印出对象3的变量值 
                                                --局部变量s销毁
        }         System.out.println(sc.m_str); --打印出对象1的变量
      

  4.   

    第一个text1是由test.changeStr打印的,在changeStr中s.m_str=new1.m_str="text1",所以打印text1
    第二个hello是由System.out.println(sc.m_str)打印的,sc.m_str在之前赋值为hello当然就显示hello
      

  5.   

    1.通过test.changeStr(sc); CS将引用传给形参S即:CS和S指向地址相同。
    2.通过  s=new1; 可以知道NEW1将引用传给了S因此改变了S即NEW1将他指向的地址给了S。所以此时的S指向的不再是CS指向的地址。
    3.以所在第一个输出时s.m_str是NEW1的m_str,但SC在全过程中并没有改没。
      

  6.   

    注意java没有传引用,而是将引用复制一份传递进去。