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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑世光 中级黑马   /  2012-9-11 15:13  /  1827 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑世光 于 2012-9-11 15:46 编辑

老毕说String s2=new String("abc"); 在内存中有两个对象。但是这里只有一个引用 s2。s2应该是指向对象"abc"的。那么另个
对象的的引用在哪里呢?指向谁?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
不是所有的对象都要当指针一样用,一个对象是引用变量s2,一个是字符串对象“abc”。他们在内存中位置不一样,一个在堆内存, 一个在栈内存。简单来说一个就是路标,一个就是真实要的东西,
回复 使用道具 举报
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。

这是总结借鉴别人的,你会明白的。多想想

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 寇龙飞 于 2012-9-11 15:37 编辑

1、“abc”本身是一个对象,因为String的构造函数:
  1. String(String original)
  2.           初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
复制代码
此对象匿名引用、无引用

2、new String(“abc”)这是另外一个对象。此对象的引用是s2
回复 使用道具 举报
杨习平 发表于 2012-9-11 15:32
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的 ...

解释的很清楚,谢谢!
回复 使用道具 举报
先是创建直接量abc这个是一个对象 newString()有创建了一个对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马