黑马程序员技术交流社区

标题: 关于String 引用的问题 [打印本页]

作者: 陈龙    时间: 2012-11-12 13:55
标题: 关于String 引用的问题
本帖最后由 陈龙 于 2012-11-12 15: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,为什么最后打印的不一样啊?

作者: 刘子义    时间: 2012-11-12 14:16
我的理解是,
String c3 = c1表示c3的栈中获得了c1的栈地址,指向同一块堆内存,
c1 = "123";又在堆中开辟了一块内存放"123",c1的栈内存同时也改为指向"123"的内存地址。
不知道理解的对不对
作者: 被遗弃者    时间: 2012-11-12 14:34
我的理解是:首先你的第一个打印C3,此时C3是指向内存“abc"的,第二个打印C1,这个是指向“123”
作者: 杜正冬    时间: 2012-11-12 14:43
栈内存 和堆内存
你用到了new 开辟的新的空间吧 然而C1你是直接赋值不在同一块内存中 不知道这样对不对
作者: 刘菲    时间: 2012-11-12 15:12
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"和"def",
也就是说c1指向"abc",c2指向"def"
String c3 = c1;这句话说明将c1的引用赋给c3,此时c3和c1都指向"abc"
  c1 = "123";这句话执行后c1的指向变了,它指向了内存中另一个存有"123"的空间,不再指向"abc"
而此时的C3仍然指向"abc"
所以打印结果是abc  123
作者: 奋斗的青春    时间: 2012-11-12 15:13
看看这张图 。

String.jpg (52.51 KB, 下载次数: 49)

String.jpg

作者: 被遗弃者    时间: 2012-11-12 15:28
刘菲 发表于 2012-11-12 15:12
public static void main(String[] args) {
  // TODO Auto-generated method stub
  String c1 = new Stri ...

透彻!!!!!
作者: 刘菲    时间: 2012-11-12 15:33
被遗弃者 发表于 2012-11-12 15:28
透彻!!!!!

嘿嘿。。。一起加油啊!
作者: 陈龙    时间: 2012-11-12 15:44
好的,谢谢大家的解答,{:soso_e104:}
作者: 许坤    时间: 2012-11-12 16:22
吴愿涛 发表于 2012-11-12 15:13
看看这张图 。

此楼正解!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2