String与其他类有什么不同吗?
public class Test {
public static void main(String[] args) {
String s = "pig";
changeStr(s);
System.out.println(s);// pig (为啥还是pig啊,没有改变)
Person p = new Person();
System.out.println(p.getName());// 白痴 ,发生改变了
}
public final static void changeStr(String temp) {
temp = "dog";
}
public final static void changePersonName(Person p) {
p.setName("白痴");
}
}
public static void main(String[] args) {
String s = "pig";
changeStr(s);
System.out.println(s);// pig (为啥还是pig啊,没有改变)
Person p = new Person();
System.out.println(p.getName());// 白痴 ,发生改变了
}
public final static void changeStr(String temp) {
temp = "dog";
}
public final static void changePersonName(Person p) {
p.setName("白痴");
}
}
对于String输出的结果仍旧是pig,没有变为dog!
有点奇怪啊!
据我推测可能是这样的(只是推测):
1.在 1 处 ,将实参s (其实就是个句柄,呵呵,我觉得就是C++中的指针)复制一份给 形参temp,示意图如下:
句柄 | 地址 |
s | 地址A |
temp | 地址A |
数据:
地址 | 数据 |
地址A | pig |
所以在此时,
System.out.println(s);
System.out.println(temp);
的结果将都是pig
2.但当运行至 2 时情况有所变化:
代码temp = "dog";并没有起到如下作用:
另内存中的数据变为
地址 | 数据 |
地址A | dog |
相反的temp = "dog";执行了一个相当 temp=new String("dog");的代码。
(呵呵,猜测,我想这是String类的特别之处!还请各位不吝赐教!)
PS:而我们编写的Person类则不会出现这种情况,所以我们看到了数据的变化,“弱智”变为了“白痴”!
所以造成如下局面:
句柄 | 地址 |
s | 地址A |
temp | 地址B |
数据:
句柄 | s数据 |
地址A | dog |
地址B | pig |
这就是为什么String与我们正常编写的类如-Person类的不同之处!至于String为什么,以及如何实现的俺以后咱学习,呵呵!
PS:java中所有的函数调用本质上都是值传递,也就是说函数的形参的值只是实参值的一个副本,不同的是,如果实参是个对象句柄(例如Person类,String类的对象),那么形参所获得就是这个对象句柄的副本;如果传递的是基本类型(如int a=3),那么我们得到就是这个基本类型的副本(这里即使3)。