解决方案 »

  1.   

    当把对象引用str1传递到一个方法后,这个方法可以改变这个对象的属性,并能返回相应的改变,但是这个对象引用指向的这个字符串是永远不会变的。
    至于你后面写的那个没有new对象的变量,想改变它的值可以这样写:
    class a (int i)
    {
    i=i+1
    }
    void main:
    int b=3
    a A=new a();
    A.add(b);sys(b)
      

  2.   

    上面这句话,可以解释后面的那个map传递吗,请解释str1的传递和map传递的不同,谢谢。
      

  3.   

    跟堆或池没关系
    因为String对象不可修改值
    str += "def";
    这一句执行之后会在堆中新建一个对象,值是abcdef,再更新str的引用,而str1没有改
      

  4.   

    static void operate(StringBuffer buffer) {
    System.out.println(buffer==buffer1);
    buffer.append("def");
    System.out.println(buffer==buffer1);
    }
    static void operate(String str) {
    System.out.println(str==str2);
    str+="def";
    System.out.println(str==str2);
    }
    static void mapAdd(Map<String,String> map) {
    map.put("aa","aa");
    }
    static StringBuffer buffer1=new StringBuffer("abc");
    static String str2="abc";
    public static void main(String[] args) {
    operate(buffer1);
    // str1指向了堆中new出的对象abc,像operate传递时,应该传递的是str1的引用
    // 在方法中操作后,str1应该指向到操作后的新的对象,也就是abcdef
    System.out.println(buffer1);
    operate(str2);
    // str2为栈中的对象,传递的就是abc数值,方法操作完后,新的值仅仅是方法中的局部变量
    // 值未带出到main方法中来,所以str2还应该是abc
    System.out.println(str2);
    Map<String,String> map=new HashMap<String,String>();
    map.put("bb","bb");
    // 这里没有疑问,mapAdd中传递的map为对象,传递的是引用,操作后map指向了操作后堆中的map值
    // 操作后,main方法中map中有两队值。
    mapAdd(map);
    for (String str : map.keySet()) {
    System.out.println(str);
    }
    }运行一下这个你就明白了
      

  5.   

     那么str指向了新的abcdef,出了方法之后,abcdef就可以被GC回收了吧,其实这里的最关键的就是String对象的不可改变值造成的。如果是普通new出来的对象的话,传递时,会在原对象值位置上修改,这样出了方法,修改的值还在原地址保存,就是值传递了吧,可以这样理解吧,大牛