public class Demo3 {
    
    public void m2(String s) { s = s + "aa";
System.out.println("My name is" + " " + s);
}    public static void main(String[] args) {
Demo3 d = new Demo3();
String f = new String("zhangsan");
d.m2(f);
System.out.println(f);
    }
}
我的问题是:在String f = new String("zhangsan");被执行的时候,对象的创建到底是怎么样一个过程?d.m2(f);被执行的时候,到底付值给m2的是什么?请高手解释下!!!感激...

解决方案 »

  1.   

    String f = new String("zhangsan");
    首先从常量池中找"zhangsan"这个字符串,然后基于它创建一个和它一样的字符串,然后赋值给f。就是这个过程了。
    d.m2(f);
    这个执行的时候,首先f“借”给 d在m2这个方法中用,只是借给你,你什么权利都没有,但是你可以仿造,也可以做个比f更好的,前提是不能损坏我的f。当方法结束之后,f就还给我,那么我的f还是我的f,至于你那里的一个也叫f的那是你自己搞的,和我无关。
    f就像是个底稿,要的时候我复印一份给你,虽然内容一样 ,可惜那不是我这份。只能这样讲了,不知道你能不能听懂。没分,只能等我这样的初学者,等不到高手的!!~!·#¥%……—
      

  2.   

    哈哈,之所以叫“借”,也只是因为f是String。如果不是String的话,该怎么着呢?
      

  3.   

    简单的说:java中一切的参数的传递都是传值的.
    所以,这题目中,的传参实际传的就是f的值,
    而你的f是,对字符串,new String("zhangsan")的引用.
    实际上,将F这个引用复制了一份.
    即在栈中,有两个引用指向了,同一个对象.
    这题中,传递过去的f虽然也是对象的引用,
    String对象没有改变的原因其实是:
    在s = s + "aa";这一过程中.
    是因为这个表达式起到的作用是:
    把s也就是f(s,和f指向的对象是同一个)指向的对象,与"ss"相连接;
    连接以后.得到一个新的对象,再将新对象的引用.交给,s
    实际上经过这一个过程以后,s,f已经不是指向同一个对象了,
    f指向原来的那一个对象,s指向了新的那一个对象.
    可以参考以下这个程序再细想
    public class Demo3 {
        public void m2(StringBuffer s) {
        s.append("ss");
    System.out.println("My name is" + " " + s);
    }
        public static void main(String[] args) {
    Demo3 d = new Demo3();
    StringBuffer f = new StringBuffer("zhangsan");
    d.m2(f);
    System.out.println(f);
        }
    }
      

  4.   

    1, Pass by value:
       a) for primitive variables
       b) for reference variables2, String Immutability
      

  5.   

    (z_lping)好精辟的回答.!
    厉害.