呵呵,有意思我只能说你多看看书吧了解String在java 中的存储形式先

解决方案 »

  1.   

    如果你明白java的method中传递参数的方法的copy reference的话,你就完全可以明白这一点了。
      

  2.   

    所以,fnSideEffect(String strTest)在被调用的时候,strTest只是str的一个
    copy,这个方法之改变了strTest的值。而String有个特殊的地方就是:
    一旦,refernce所指向的String的值发生改变,JVM会在内存里面生成另外一个String object。
    所以你程序运行的结果就是这样了。你可以让这个method改为返回一个String,然后在赋给str,这样就可以改变的str的值了。
      

  3.   

    如果传递一个HashMap,数组呢?
    import java.util.*;
    public class SideEffect
    {
    public static void fnSideEffect(HashMap hm)
    {
    hm.put("one","this is one");
    hm.put("two","this is two");
    }
    public static void main(String[] args) 
    {
    HashMap myHm=new HashMap();
    myHm.put("one","this is one,inside main()");
    myHm.put("two","this is two,inside main()"); System.out.println(myHm.get("one"));//输出one","this is one,inside main()
    System.out.println(myHm.get("two"));//输出two","this is two,inside main() fnSideEffect(myHm); System.out.println(myHm.get("one"));//输出one","this is one
    System.out.println(myHm.get("two"));//输出two","this is two
    }
    }
      

  4.   

    哪里有介绍copy reference的知识,给个地址。
      

  5.   

    没错啊?输出结果就应该是这样。
    你在main()里面用fnSideEffect(myHm)之后,就把myHm里面其中的两个Key对于的value替换掉了,输出结果就变成替换后的结果。
    如果你能明白调用method时候的copy reference的道理和String Object的特殊性,我想上面的结果不应该出乎意料的。那,
    你的问题是什么呢?
      

  6.   

    呵呵,这只是JAVA OOP里面的基本知识,我建议你看一看Think in java这本java programmer 入门必读的书,看英文版的吧,中文的翻译的不太好。
      

  7.   

    那到底那些类型具有“特殊性“呢?
    我是从C/C++转过来的,java的传递实在搞不懂,烦请各位。
      

  8.   

    唉,各位,我就是看Think in java才产生这样的麻烦。
      

  9.   

    我想主要是String 这种Object把你搞晕了。其实只要记住:
    一旦某个reference(pointer)指向的String Object的值改变的话,内存中会生成另外一个等于改变后的值的String Object供原先的reference调用:
    String a = "ABC";
    a = "BCD";
    运行之后,a 是指向"BCD"这个新生成的Object了。 
      

  10.   

    至于其它的Object,就不是这样的,所以对于String的处理,在java中还是需要小心点的。尤其是考虑到performance的问题的时候。
      

  11.   

    我记得“java2 核心技术-基础知识”这本书里面对method中copy reference的特性也有阐述,你可以参阅一下。