A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海涛 中级黑马   /  2013-1-13 07:13  /  1619 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张海涛 于 2013-1-15 01:46 编辑

public static void main(String[] args) {   // TODO Auto-generated method stub   String c1 = new String("abc");   String c2 = new String("def");   String c3 = c1; //将c1对象引用赋予c3,即c1,c3指向同一块内存  c1 ="123";   System.out.println(c3);   System.out.println(c1); }打印结果是:abc                  123但是,有一点疑问,既然c1,c3指向同一块内存,通过  c1 ="123";这块内存的内容应该变为"123",所以应该打印出两个123,为什么最后打印的不一样啊?(手机发表的,格式可能有点乱,望谅解)

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
class  Test
{
public static void main(String[] args)
{  
// TODO Auto-generated method stub  
String c1 = new String("abc");
String c2 = new String("def");  
String c3 = c1;
//将c1对象引用赋予c3,即c1,c3指向同一块内存  c1 ="123";
  System.out.println(c3);  
System.out.println(c1);
}
}
我调试的结果打印为2个abc,你仔细检查一下,看是不是漏写了什么。

I9SQ_1]_L@@S$]32QT[WIGY.jpg (7.22 KB, 下载次数: 26)

I9SQ_1]_L@@S$]32QT[WIGY.jpg
回复 使用道具 举报
这个问题容易进一个误区,主要是要明确字符串的特点:一旦被初始化就不会改变。
c1 ="123";这句话的意思是创建一个新的字符串而不是将字符串abc改为123,并将新字符串的地址值赋给c1,和c3没有关系,c3依旧指向abc。

这个是由字符串自身的特点决定的,改成StringBuilder效果就来了

StringBuilder s1 = new StringBuilder();
                s1.append("abc");
                StringBuilder s2 = s1;
                s2.append("def");
                System.out.println(s1);
                System.out.println(s2);
打印结果
abcdef
abcdef
回复 使用道具 举报
      我理解楼主的意思应该是字符串c3指向了c1,为什么,c1="123";之后,c3的值仍是原来的。这个必须要记住字符串初始化过一次后就不能再改变了。
    当String  c1=new String("abc");其实是在堆内存中创建了匿名的,值为abc的字符串,然后栈内存创建了个名字为c1的字符串指向abc所在位置;c3=c1,则c3也指向c1指向的位置。而c1=“123”;时,JVM会先在堆内存中寻找有没有已存在的123字符串,如果有,让c1指向它,若没有,则新创建一个,让c1指向它。
    我们经常说字符串常量,而不是变量,就是这个道理,c1改变的一直只是里面存储的字符串的地址,而不是它一直指向同一个地址而其中的内容发生变化。
头一次画图,希望能有助于你理解。
(画的有点粗糙,嘿嘿)

未命名.GIF (4.1 KB, 下载次数: 23)

未命名.GIF
回复 使用道具 举报
你问题中应该少写了一句话,在c3=c1后应该还写了句c1="123"吧。你的意思是c3=c1他俩的引用地址指向同一个地址,所以改变c1=“123”时,c3也应该跟着变。其实这是个误区,因为在执行C1="123"时,它其实执行的是new的操作,也就是经常遇到的String c1 = new String("123")产生几个对象的问题,其实在这句话中产生了2个对象,一个string型的引用变量c1,一个String的对象"123",然后将c1的引用指向产生的"123".而在你程序中C1="123"时其实也是这么个过程,只不过C1已经存在了 所以就只创建了"123"的对象,并将c1的引用指向了"123",所以打印出来就是"123"。注意String的这个特点,它是创建新的对象改变引用的指向,而不是直接修改引用的内容。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马