public class test {
   public static void main(String []args) {
   String s="java";
   StringBuffer buffer=new StringBuffer(s);
   change(s,buffer);
   System.out.println(s);
   System.out.println(buffer);
   }
   private static void change(String s,StringBuffer buffer){
   s=s+" and html";
   buffer.append(" and html");
   }
}
    为什么s的值还是java而不是java and html  ,是因为String类的值不能改动吗?谢谢了

解决方案 »

  1.   

    是啊。String类的值不能改动啊。
      

  2.   

    恩,string 是常量字符串,不能改变其内容
      

  3.   

    恩,string 是常量字符串,不能改变其内容
      

  4.   

    不是因为String不能改动,而是java中的参数传递都是值传递。你在change方法中,对s这个参数做了改变,这种改变不会带回到调用方法(main)。比如,你把程序改为:
    private static void change(String s,StringBuffer buffer){ 
      s=s+" and html"; 
      StringBuffer sb=new StringBuffer();
      sb.append(buffer);
      sb.append(" and html");
      buffer=sb;
      } 同样的,main方法中的buffer值也是不会改变的。道理是一样的。这里还有一个问题,如果形参是String,能不能在方法中通过这个形参,对其内容做修改呢?答案是不能。
    因为String类的方法中,如果对内容做了改变,结果一定是用新的引用指向。这可能就是String叫不可变字符串的原因。
      

  5.   

    貌似4楼都是值传递不对吧,只有基本数据类型和String是值传递啊,其他的是引用传递,
    像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
    StringBuffer buffer=new StringBuffer(s); 
      change(s,buffer); 
      这里的2个引用buffer是不相同的
      

  6.   

    貌似4楼都是值传递不对吧,只有基本数据类型和String是值传递啊,其他的是引用传递,
    像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
    StringBuffer buffer=new StringBuffer(s); 
      change(s,buffer); 
      这里的2个引用buffer是不相同的,只是所指对象一样
      

  7.   

    参数如果是基本类型,是把实参的值传给了形参.
    参数如果是引用类型(也就是非基本类型),是把实参的引用的值传给了形参.传递的还是值,只不过这个值是引用.String做参数,传过去的,也是引用的值.和其它引用做参数一样,没有什么不同.
      

  8.   

    在java中,没有地址传递这个概念,所有的都是值传递
    你的这个
    s=s+" and html"; 
    只是改变了这个方法里的s而没有改变实例变量中的s,它们是两个概念
    你试试这个
    this.s = s+" and html";
      

  9.   

    的确java中的参数传递都是值传递,对象作为参数的时候也不会改变它的指向,但是改变对象的内部状态是可以的,buffer作为参数传递是可以改变它的值的
      

  10.   

    因为String类型前面FINAL,注定了你操作的是其引用。API里面有写
      

  11.   

    因为String类型前面有FINAL修饰,注定了你操作的是其引用。API里面有写
      

  12.   

    string 类型是改变值改变地址,而stringBuffer是从当前地址上改变了他的值而方法返回是返回的数据指针指向的地址。所有s初始的地址指向的还是“java”,stringBuffer的值则变成了"java and html".  
      

  13.   

    http://hi.baidu.com/%C5%DD%B0%C9%BA%C8%BE%C6/blog/item/eb140a39c9cd70f5b211c7bb.html
    看看这个分析
      

  14.   

    4楼正解,你们1楼2楼的全错,这跟String可不可变没关系。
    在java里所有的方法调用都是值传递,此帖子中的是String的引用的值的传递,意味着change方法中的s只是main中s的一个副本。
    “String是不可变”这句话应该这么理解:
    1.String是final类,不能够继承。
    2.String中没有相关方法可以改变String内部的字符序列。
    Color,Font之类的类和String一样都是“不可变的”。
      

  15.   

    在c#中是可以这样的,你只要传递参数的时候采用ref 引用。但是java没有ref这个关键字,也没有这个用法。
    LZ的做法和String类型没有什么关系,就是传别的值也一样,因为参数传递是值传递。
      

  16.   

    String 虽然也是一种引用类型
    但它在JAVA中已经作了特殊处理
    每次改变它的值是,JVM就会自动生成一个新的String对象
    也就是地址就会不同了
    正因为这个,在对String对象进行很多次的连接(+)操作时
    String性能就会大打折扣
    从而StringBuffer就出现了
    以提高这方面的性能