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的是什么?请高手解释下!!!感激...
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的是什么?请高手解释下!!!感激...
首先从常量池中找"zhangsan"这个字符串,然后基于它创建一个和它一样的字符串,然后赋值给f。就是这个过程了。
d.m2(f);
这个执行的时候,首先f“借”给 d在m2这个方法中用,只是借给你,你什么权利都没有,但是你可以仿造,也可以做个比f更好的,前提是不能损坏我的f。当方法结束之后,f就还给我,那么我的f还是我的f,至于你那里的一个也叫f的那是你自己搞的,和我无关。
f就像是个底稿,要的时候我复印一份给你,虽然内容一样 ,可惜那不是我这份。只能这样讲了,不知道你能不能听懂。没分,只能等我这样的初学者,等不到高手的!!~!·#¥%……—
所以,这题目中,的传参实际传的就是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);
}
}
a) for primitive variables
b) for reference variables2, String Immutability
厉害.