结果为什么会不同???
程序1:
public class X {
    public static void modify(String s) {
        s += ",world!";
    }    public static void main(String[] args) {
        String s = new String("Hello");
        modify(s);
        System.out.println(s);
    }}程序2:
class Letter {
    String c;
}public class PassObject {
    static void f(Letter y) {
        y.c += ",world!";
    }    public static void main(String[] args) {
        Letter x = new Letter();
        x.c = "hello";
        f(x);
        System.out.println(x.c);
    }
}String

解决方案 »

  1.   

    s += ",world!";
    这个语句创建了一个新的String对象并赋值给s,所以原对象的内容不会被改变。
      

  2.   

    程序1    public static void modify(String s) {
            s += ",world!";
        }这个s 是 main函数里面String s 的一个拷贝。
    拷贝的内容是一个内存地址。s+=",world";
    此时,产生了一个新的字符串 Hello world
    s 指向的地址不再是 原来地址了。
      

  3.   

    String 是不可变类型 还有一个就是就是变量的作用域不同public class X {
        public static void modify(String s1) {//这里接受引用,注意这个s和main方法中的s不是同一个
            s += ",world!";//这个等同于s = s+",world!" s+",world!"这句新建了一个字符串对象,并将地址给了s 
            System.out.println(s);//我们可以在这里加个输出看看是什么 这里应该是hello,world1
       }    public static void main(String[] args) {
            String s = new String("Hello");//这里将new出来的字符串的地址给了s变量
            modify(s);//调用方法传引用
            System.out.println(s);
        }}
      

  4.   

    java中方法传值的问题。java只会传值。而这个值在本例中就只是个字符串s的引用。也就是说,main方法中的s 和modify方法中的s是两个指向同一个地址的引用。而string是不可变的对象。使用+=相当于有创建了一个新的字符串,并且modify方法中的s重新指向了这个新的字符串。但main方法中的s仍然指向之前的地址。第二个例子中的两个对象开始的时候指向的都是同一个引用,之后,y改变了y中的实例的值,但是x 和y仍然指向同一个地址,所以,x中的实例的值也变了。
      

  5.   

    首先看程序一:字符串的内容不可以被修改,如果想要改变字符串的内容只能改变存这个字符串的地址,字符串变量属于对象String是一个类,那么调用modify(s)时将s的地址复制了,也就是说modify方法中的s(注意是modify(String s)中的s)-->hello当改变s的值时,只能改变地址-->word,但是main方法中的s地址并没有改变依然-->hello
    程序二:分析方法类似一但是要注意此时class Letter 有一个地址里面存的是String c的地址,方法的f(letter l)传递的是  Letter x = new Letter();地址的复制,这个地址有存有String c的地址,所以当字符串改变时,l的地址不变变得只是c的地址,
    class Letter {
        String c;
    }public class PassObject {
        static void f(Letter y) {
            y.c += ",world!";
        }    public static void main(String[] args) {
            Letter x = new Letter();
            x.c = "hello";
            f(x);\\x-->c地址1-->内容:hello
                   \\x-->c地址2-->内容:hello,world

                    \\x的地址不变,变得只是x中字符串的地址
            System.out.println(x.c);
        }
    }
      

  6.   

    java都是传值,String是常量,可以参考StringBuffer和String的区别,就这题而言,就是传值的问题了。
      

  7.   

    第一个是方法又重新new了一个字符串,这个字符串的生命周期是方法的结束。第二个是在方法里改变对象的属性值,那么该对象的属性值就被改变了,直到对象属性被重新赋值或对象生命周期结束。
      

  8.   


    楼上说的不错,java参数传递是传值的,第一个是地址的改变(字符串赋值可以认为是new,但绝不是new),第二个是地址所指向的内容的改变,x,y地址相同,任何一个对内容的修改都会反映到另一个中。
      

  9.   

    将你那个代码改一下,你自己运行看看,就理解了
    public class X {
        public static void modify(StringBuffer s) {
             s =s.append(",world!");
        }    public static void main(String[] args) {
            StringBuffer s = new StringBuffer("Hello");
            modify(s);
            System.out.println(s);
        }}