我测试了第三个还是1
str(out); //这个out在哪定义?
      

解决方案 »

  1.   

    string对象能修改阿。
    String a = "a";
    a = "b";
    就把a的值修改为b了。exp3应该同不过编译吧
    str(Sting out)没定义的。
      

  2.   

    第三个写错了应该是
    public class test{ 
       String output = "";
       public static void main(String args[]){ 
        test t = new test();
       } 
       test(){
         str(output);      
          System.out.println(output);
     }
     void str(String output){
      int i = 1;
      output = output + i;    }
    }
      

  3.   

    如上所说,你的程序写错了,
    如改成的str(out); --> str(); 话三个程序是一样的。
    str(out); 不能调用str();因为他们的参数不一样,你应该看一下重载。
      

  4.   

    To:: magicjohn(默克) 
    我不知道你所说的是overring or overloaing,但我的意思是问:String 类创建的对象不是不能对它自身进行修改吗?为什么前两个的结果会输出1呢?
    而最后一个是参数传递,它的结果却为空。understand。
      

  5.   

    说明一下:
    java中的String的实例是不能修改内容的。
    那些操作符只是产生新的String对象并用引用指向新实例。
      

  6.   

    这里针对你的承续说明一下:
    void str(String output){
      int i = 1;
      output = output + i;   
    }这里的output指局部变量并不是类成员,因此在这里output的引用被改成指
    向"1"的引用,如果你在方法内将它输出就会发现它的值是"1"
    但是该方法外的output引用的对象并没有改变,它指向的还是原来对象实例,
    就是空字符串。
      

  7.   

    output = output + i;
    这里生成了一个新实例并用output指向他但这个引用是局部的。
      

  8.   

    所谓String 类不能修改,是指存在内存中的字符串本身不能被修改,
    而不是对该字符串的引用。引用还是能修改的。
      

  9.   

    exp3的output是局部变量,和类成员变量不同。
      

  10.   

    另外,有一点要说明,
    println方法实参是"abc..."+ i(i不是String类对象)时,会调用
    toString方法,而这个方法则会临时创建一个StringBuffer类的对象,
    然后在这个对象上操作,最后返回的其实是这个对象。