class Test{
private static void setString(String str1)
{
      str1="a";}
public static void main(String[] s){   String strtest=new String("abc");  setString(strtest);
  System.out.println(strtest);}
}为什么输入是a
本来我一直以为输出应该是abc的,因为string是一类,当作为参数传递时应该是传递的是引用,可是为什么这个string如此特殊!
我现在把string理解为一个基本类型,所以输出是a
一个特殊的类!!

解决方案 »

  1.   

    输出的确实是abc,楼主是不是还有一些方法没写
      

  2.   

    呵呵,不好意思不好意思!!
    结果是abc
    但是我本来觉得是a的有谁能解释一下为什么呢?
      

  3.   

    class Test{
    private static void setString(String str1)
    {
          str1="a";}
    public static void main(String[] s){   String strtest=new String("abc");  setString(strtest);
      System.out.println(strtest);}
    }为什么输入是abc
    本来我一直以为输出应该是a的,因为string是一类,当作为参数传递时应该是传递的是引用,可是为什么这个string如此特殊!
    我现在把string理解为一个基本类型,所以输出是abc
    一个特殊的类!!
      

  4.   

    在main中的,strtest是refering到"abc"的,现在把strtest的referance传递到method setString中,此时,strl也是refering到"abc"的,而 str1="a"; 改变str1,使它refering 到 "a"。但是这条语句并不改变strtest这个referance。其实这个问题的关键就是要理解strtest和str1是两个不同的referances,他们曾经refering到同一个对象(不知道object是不是这么叫的), 但是后来str1被改变,可是strtest并没有变,所以setString不起作用,输出的还是"abc"
      

  5.   

    http://community.csdn.net/Expert/topic/3993/3993622.xml?temp=.6112329@.@||~
      

  6.   

    Maxcellent(庄生)是正解。
    不过如果搂主对C比较收悉的话,我用更通俗的说法来解释下:我们将java中的对象变量都当作C中的指针来看待(其实java中也是这样实现的)strtest 就是一指向 字符串"abc" 的指针。
    setString(strtest) 则将strtest 传递给形参指针strl,这时strl也指向了"abc",而 strl = "a"将strl指向了字符串"a"。
    setString(strtest) 执行完后,strtest仍没有变化。重点是:函数setString(strtest),只是将strtest的地址传递给 strl,让strl也指向同样的对象。
    要想真正改变strtest的状态,则改变strl所指向的对象的内容,而不是改变strl 所指向的地址
      

  7.   

    结果是:abc
    欢迎加入JAVA群:11131482
    要求:至少工作一年
      

  8.   

    Sanco(God of Tmac)真够通俗的。呵呵
    strtest 就是一指向 字符串"abc" 的指针.看这一句下面就知道了。。
    (C不熟的就不提了)
      

  9.   

    你换一下StringBuffer类再试一下就行了,String是不一样的
      

  10.   

    首先感谢Sanco(God of Tmac)我现在是这样理解的,大家看看对不对!
    strtest传递到setString中后和str1指向的是同一个地址,也就是
    strtest---|
              ---abc
    str1------|
    但是现在改变str1的话,相当于str1产生了一个新的string对象,使str1指向a的(因为string是一个常量),但是strtest还是指向abc
      

  11.   

    其实用指针的方法去理解最好,c语言上对这些有详细的说明。
    java中所有的对象都是用类似指针的变量方式来实现,
    所以重要的不是改变变量本身,而是改变变量所指向的对象。
      

  12.   

    楼主如果要操作这个String对象的话
    简单的实现方式是把这个对象变成对象的属性,这样就没有什么问题了。
      

  13.   

    同意大家的解释。
    另外,在java中,String对象一但产生后都是常量,是不能在改变值的。

    String a = "abc";
    a = "xy";
    这样只是改变了引用a的值从"abc"到"xy",内存中"abc"的值没有改变。
    直到没有对"abc"的引用后,java垃圾处理掉"abc",内存释放才可在用,但这些不需要我们去做了。
      

  14.   

    而对于 StringBuffer对象却不同:
    StringBuffer sb = new StringBuffer("abc");
    如果调用function
    void fn(StringBuffer sb){
    sb.append("xy");
    }
    则,sb就会变成"abcxy",调用 StirngBuffer 的其它方法也会发生改变。
    StirngBuffer是实际的处理了它所指的内存缓冲区。
    但如果function改为:
    void fn(StringBuffer sb){
    sb = new StringBuffer("mm");
    sb.append("xy");
    }
    在此之后
    System.out.print(sb.toString());
    会发现结果:"abc"
    问题在于,外面的sb和fn里面的sb并不是同一个东东,可看成sb1和sb2,但刚进fn时指向同一个内容,后来sb2指向了个新的内容,而sb1还是指向原来的"abc",所以不会变。
    String对象和它道理相似,进入函数后,它只能改变“指向”,不能改变原来的内容,所以外面的String 不会改变。
      

  15.   

    我是说:
    str1 = "a";
    str1 = new String("a");
    这两个家伙等价!!!
    然后String中没有函数
    可以改变他自己的值!!!
    如:
    String str = new String(" I love Java!!!    ");
    str = str.trim();
      

  16.   

    kennywxf(小强) 你已经理解了。
      

  17.   

    这不是显然的吗?
    str 的值是"a"
    stringstr的值是"abc"
    又没有出现赋值,怎么会乱使用对象的空间呢?
    注意str = "a" 只对str这个变量起作用,对别的不起作用,而你在方法里定义的赋值相当于初始化
      

  18.   

    class Test{
    private static void setString(String str1)
    {
          str1="a";}
    public static void main(String[] s){   String strtest=new String("abc");  setString(strtest);
      System.out.println(strtest);}
    }
    哈哈,有那么复杂吗????
    private static void setString(String str1)
    {
          str1="a";}
    str1出了方法就离开有效域了,又没return,当然是"abc"
      

  19.   

    也就说说java回产生两个指针,而c 不会
      

  20.   

    楼上各位不是吧。
    我没有学过C 直接学的JAVA。我刚开始学,还没学到String。但我的理解是。
    str1="a"
    strtest="abc"
    两个不同的对象,如此而已。
    要输出的是strtest
    而setString()这个方法创建的是strl这个对象并给他赋值a
      

  21.   

    也就说说java回产生两个指针,而c 不会
    看下面的例子:
    #include<stdio.h>void change(int *a){
        *a=3;
    }
    void main ()
    {int y, *x;
    y=5;
    x=&y;
    change(x);printf("%d",*x);输出的是3,而不是5
      

  22.   

    主要是因为String的对象是不边的,你换成StringBuffer就回输出a 了class Test{
    private static void setString(StringBuffer str1)
    {
          str1.append("good");}
    public static void main(String[] s){   StringBuffer strtest=new StringBuffer("abc");  setString(strtest);
      System.out.println(strtest);}
    }
      

  23.   

    在学习String类的时候,说String是不变的,到用的时候,就不知道了,看来我要好好反省一下.
      

  24.   

    这个就是别名问题
    看看<<thinking in java>>
    就知道了