String s1=new String("abc");
s1是对象吧?但是下面的代码输出结果是abc,说明是值调用不是引用调用.
public void returnStr(String str){
        str="nnnnn";
    }public static void main(String[] args) {
        Teststr teststr = new Teststr();
        String s1=new String("abc");
        teststr.returnStr(s1);
        System.out.println(s1);
    }
为什么传的是对象 却不是引用调用呢??矛盾啊!难道s1不是对象吗?
哪位高手帮我解释一下啊 谢谢了

解决方案 »

  1.   

    s1是指向存放"abc"的内存地址的对象。
    在java里只有值传递
      

  2.   

    因为你的S1="nnnnn"只在returnStr()函数中有用,函数结束之后就不会再使用这个调用了,而是str="abc"
    这和对象,引用好像没关系吧。只是涉及到变量作用范围。
    换句话说,s1="abc"和s1="nnnnn"应该用到了2个不同的引用。不知道这么解释对不对。。好像越说越乱了。。
      

  3.   

    String 是不可变的类
    当执行 returnStr方法时,只是使returnStr方法里的局部变量str="nnnnn"(会新产生一个String对象),再者传参是传值的
      

  4.   

    JAVA里有引用传递啊 传对象进去 形参变了 实参也变 这种情况多常见
      

  5.   

    形参 跟 实参 都换成StringBuffer 结果也是一样的
      

  6.   

    http://blog.csdn.net/ZangXT/archive/2008/07/15/2651577.aspx
    自己看看吧
      

  7.   

    public class TestCSDN {
    public String  returnStr(String str){ 
            return  str="b";
        } 
    public static void main(String[] args) { 
    TestCSDN teststr = new TestCSDN(); 
    String str1="a";
            System.out.println(teststr.returnStr(str1));
            System.out.println(str1);
        } 
    }对比下,自己看看咯
      

  8.   

    String s1=new String("abc"); 
    String str=s1;
    str="nnnnn"; 这样结果是:
    s1="abc";
    str="nnnnn";
    因为str="nnnnn";就等于str=new String("nnnnn");
    只是对str赋了两次值,怎么会影响到s1?????
    楼主的例子等同
      

  9.   

    http://blog.csdn.net/ZangXT/archive/2008/06/21/2574102.aspx
      

  10.   

    误人子弟???String对象做参数是传值的???
      

  11.   

    java 语言使用的是“值传递”,也就是说,方法得到的是所有参数的值的拷贝,而不是这个参数的实际变量位置。
    例如以下语句:
    class test
    {
     void testValue(int k)
      {k=k*3;} public static void main(String[] args)
     {int i=3;
      test test1=new test();
      System.out.println("first i="+i)
      test1.testValue(i);//这里传递的是变量 i 的值,而不是变量i,而且方法运行后,方法的参数(i)就不再使用了.
      System.out.println("last i="+i)
      }
    }
    输出结果:
    first i=3
    last i=3所以,一个方法是不可能修改一个基本数据类型的参数的值的。除非通过对象引用。