博客统计信息

用户名:cfan_haifeng
文章数:12
评论数:28
访问量:33311
无忧币:52
博客积分:630
博客等级:4
注册日期:2008-07-05

String的疑惑
2008-11-09 19:36:58
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://sunfish.blog.51cto.com/417500/111261
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)。

本文出自 “sunfish 翻车鱼” 博客,请务必保留此出处http://sunfish.blog.51cto.com/417500/111261

分享至
更多
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:Java SE技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 <<   1   2   >>   页数 ( 1/2 )  
2008-11-13 11:33:37
不错的文章!支持一下!
博主回复:
2008-11-14 15:03:45
谢谢!

2008-11-13 20:40:30
还有一点要提,就是不变类的概念,因为你用String举例了。
还有你的两个例子不是很对称,一个是调用构造子,一个是调用一般的方法。你应该要么都调用构造子,要么都调用一般方法。比如String的小写换大写,这时候你再试试StringBuilder,看看和String一样不。
博主回复:
2008-11-14 13:11:10
"两个例子不是很对称",说的不错!
但Strng一定是较特别,我也想不出来好办法,只是发现String给我想象的不一样,见笑了

2008-11-14 13:25:20
对,String很特别,其实我的意思是,你的例子里不但要说明传值的概念,还应该有不变类的概念,或者说原型模式。

2008-11-14 13:29:01
或者这么说,我觉得你应该是学C 的(你文章里有提到),C 控制形参指针可以用两个const,你只解释了其中一个const在java中的默认行为,那另一个const呢?
博主回复:
2008-11-15 20:33:45
呵呵,学C,C++的时间是比java长!可惜都“jiuzhe馒头一起吃了”!你提到的东西,有些印象,但又不确定!似乎String有个“池” 的概念....,又似乎jdk对其很照顾,与其他对象不同,似乎在内存中的位置都不一样....
哎,不懂地方,不清楚的地方好多,可最近事情挺多,也没精力继续追究了,希望它日有机会好好研究研究。呵呵.....

2008-11-15 20:46:54
哎,好像是给自己找借口!不过真的有点事情!呵呵应付面试,写论文,实习...
hehe

 <<   1   2   >>   页数 ( 1/2 )  

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: