String的疑惑

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("白痴");
}

}
对于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)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章