应该是static String s1 = "111";即没有new,还是static的缘故吧

解决方案 »

  1.   

    当执行app.m1(s1);时,s和s1都指向“111”,
    app.m1(s1);结束时s指向“111hello”,s1仍指向"111".
      

  2.   

    String的concat方法是将一字符串连接到当前字符串的尾部,同时返回连接好的长字符串,但是当前字符串本身没有改变。可以在m1方法中得出:试一试
    void m1( String s ) 

      s = s.concat("hello"); 
      System.out.println(s.concat("hello"));

      

  3.   

    String.concat()会把两个String 连起来然后产生一个新的String,但是本身没有变。StringBuffer 则不同,它会把append中的东西放在自己后面。
      

  4.   

    虫子说的很正确,String.concat()创建的是一个新的String,也就是说它返回的是一个新的字符串对象,对原对象没有影响。看看下面的程序可能对你有所帮助。
    class TestCommon{
        static String s1 = "111";
        static StringBuffer s2 = new StringBuffer("111") ;     String m1( String s ) { 
            s = s.concat("hello"); 
    return s;
        } 
        
        void m2( StringBuffer s ) { 
            s = s.append( "hello") ; 
        }  
        public static void main(String args[]) {
            TestCommon app = new TestCommon();
            String ss = app.m1(s1);
            app.m2(s2);
            System.out.println("s1 = "+s1);
    System.out.println("ss = "+ss);
            System.out.println ("s2 = "+s2);
        }}
      

  5.   

    static String s1 = "111";
    static StringBuffer s2= new StringBuffer("111") ; void m1( String s ) { 
         s = s.concat("hello"); 
    }s1 向方法m1中的s传递一个值,而s的值的改变不会影响s1的值.
    s2 向方法m2中的s是按引用传递的,所以s 的值的改变会影响s2的值.
      

  6.   

    错误的,Java所有的都是按值传递。在IBM的的developerworks的Java区里有
    文章详细阐述过了。
    至于这个问题。关键在于String 与 StringBuffer类的不同。
    String类的方法都是返回一个新产生的String,而自身不变。
    但StringBuffer不一样,它的方法都是在自身上作修改,然后返回自身。
    在你的例子中,导致s2值变化的原因在于append()方法,而不是那个赋值
    也就是说
    void m2( StringBuffer s ) { 
    s = s.append( "hello") ; 
    }  改成
    void m2( StringBuffer s ) { 
    s.append( "hello") ; 
    }  
    效果也是一样的。
      

  7.   

    楼上兄弟:
    class TestString1{
    static String s1 = new String("111");
    public static void main(String args[]) {
    s1 = s1.concat( "s3") ;
    System.out.println("s1="+s1);
    }}
    看看结果
      

  8.   

    结果是s1=111s3
    赋值生效
    改变s1的值是因为s1指向了新的String"111s3",而这个"111s3"是由s1.concat("s3")产生的。
    你可以试试看这个
    class TestString1{
    static String s1 = new String("111");
    public static void main(String args[]) {
    s1.concat( "s3") ;
    System.out.println("s1="+s1);
    }}
      

  9.   

    说到底,String 中的contat方法返回的是一个新的对象,所以它的改变不会对原对象进行改变,而StringBuffer则是对原对象的改变,不产生新对象,不用再争了。
      

  10.   

    String变量一旦赋值,则不会被更改。
    若想改变,则用StringBuffer定义变量。
      

  11.   

    Java中的参数传递是和C++不一样的。
    对于这样的函数
    class A{
          void fun1(A o)
          {
             o = null;
          }
          public static void main(String args[])
          {
             A a = new A();
             A b = new B();
             a.fun1(b);
             这里执行完了,b!=null;
          }
    }但如果这个传递是C++的引用传递的话
    结果就不一样的,b=null;所以,Java对象参数传递类似于C里面的指针值传递。
    fun1(void *p)
    {
      p = NULL;//这是无效的;
      *p  = 1;//这是有效的
    }也就是说,在Java中你能改变作为参数传入的对象实体的成员,
    但不能改变对像实体的本身。
    也就是说第一个帖子中的那两个函数的赋值运算是没有什么用处的。
      

  12.   

    刚才打错了
     A a = new A();
     A b = new B();
    ````````````````````这里应该是A b = new A();
      

  13.   

    对不起,这里打错了
    A a = new A();
             A b = new B();
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这里应该是A b = new A();
      

  14.   

    刚才看到还有一个关于争论String的帖子,收获不浅。
    谢谢各位的回复,现在开始送分了。