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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈龙 高级黑马   /  2012-11-12 13:55  /  2084 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈龙 于 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,为什么最后打印的不一样啊?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 神马都是浮云

查看全部评分

9 个回复

倒序浏览
我的理解是,
String c3 = c1表示c3的栈中获得了c1的栈地址,指向同一块堆内存,
c1 = "123";又在堆中开辟了一块内存放"123",c1的栈内存同时也改为指向"123"的内存地址。
不知道理解的对不对
回复 使用道具 举报
我的理解是:首先你的第一个打印C3,此时C3是指向内存“abc"的,第二个打印C1,这个是指向“123”
回复 使用道具 举报
栈内存 和堆内存
你用到了new 开辟的新的空间吧 然而C1你是直接赋值不在同一块内存中 不知道这样对不对
回复 使用道具 举报
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:15

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
看看这张图 。

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

String.jpg
回复 使用道具 举报
刘菲 发表于 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:08
8#
被遗弃者 发表于 2012-11-12 15:28
透彻!!!!!

嘿嘿。。。一起加油啊!
回复 使用道具 举报
陈龙 高级黑马 2012-11-12 15:44:42
9#
好的,谢谢大家的解答,{:soso_e104:}
回复 使用道具 举报
许坤 中级黑马 2012-11-12 16:22:13
10#
吴愿涛 发表于 2012-11-12 15:13
看看这张图 。

此楼正解!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马