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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王廷顺 中级黑马   /  2013-5-16 21:15  /  1779 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师的视频里讲字符串类:
String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象。
                            //字符串最大特点,一旦被初始化就不可以被改变。
          
          String s2 = new String("abc");

          //s1和s2有什么区别?
          //s1在内存中有有一个对象。
          //s2在内存中有两个对象。
我的问题是,s2在内存中有两个对象,那这两个对象是怎样存储的?,s2指向的是谁?最好能画图解释。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

9 个回复

倒序浏览
本帖最后由 曹睿翔 于 2013-5-16 22:20 编辑

“不错不错!
及时更改帖子状态,编辑为已解决”
一次性打开太多帖子,回复错了,哈哈
回复 使用道具 举报
这是一张图解,不是现在画的,但是也是这个问题,希望对你有帮助!

字符串.png (75.11 KB, 下载次数: 0)

字符串.png

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我的理解是:
String是一个特殊的类,那么,也有一般类的特点,可以有构造函数,而String类有带参数的构造函数,也有不带参数的构造函数,即  :
  1. public final  class String {
  2. public String(){,,,,,,}
  3. public String(String original){,,,,,,}
  4. }
复制代码
String s2 = new String("abc");   这里就相当于在有带参数的构造函数的所有代码前有一个隐式的无参的super语句,
因为在实例化时可以是空字符串。s2就指向了一个空字符串 和一个 具体的"abc" 对象。

也可以这样理解,"abc"已经是一个具体的对象了,再new 一个,不就2个对象了嘛

不知道理解的是不是这回事?
回复 使用道具 举报
王婷婷 发表于 2013-5-16 22:14
我的理解是:
String是一个特殊的类,那么,也有一般类的特点,可以有构造函数,而String类有带参数的构造 ...

String s2 = new String("abc");   这里就相当于在有带参数的构造函数的所有代码前有一个隐式的无参的super语句
别出心裁,有意思,不过不对,嘿嘿
String 类被final修饰,哪来的子类,更没有super()语句,顶多是构造函数间this()语句调用
下一句是对的
回复 使用道具 举报
曹睿翔 发表于 2013-5-16 22:48
String s2 = new String("abc");   这里就相当于在有带参数的构造函数的所有代码前有一个隐式的无参的sup ...

哦哦,对哦,是 this  
super是子类访问父类中的变量  用的
呃,真不好意思,,没学好哎,,
回复 使用道具 举报
陈志强 发表于 2013-5-16 22:03
这是一张图解,不是现在画的,但是也是这个问题,希望对你有帮助!

前两个语句解释的都很好,就是第三条语句这里我还有点疑问,按你的图解好像是new这个对象包含着"abc"对象,是这样吗,如果是的话,他们的地址值是怎样赋值的呢,对象"abc"的地址值赋给new对象?new对象的地址值再赋给str3? 如果不是,这两个对象在内存中是怎样存储的 是包含形式的还是并列形式的 str3如果指向对象"abc"  new对象又被谁指向呢。
回复 使用道具 举报
王廷顺 发表于 2013-5-17 20:56
前两个语句解释的都很好,就是第三条语句这里我还有点疑问,按你的图解好像是new这个对象包含着"abc"对象 ...

不是的,首先通过new关键字创建一个对象的话,比如是“abc”,会先去常量池中查找是否已经有了”abc”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”abc”对象的拷贝对象。那么在堆内存中就有了个new出来的对象,而new对象的内存地址就赋给了str3,而str3也就指向了这个对象,这是其一,再者,string不是八种基本数据类型中的一种。它创建对象时会先在内存中的常量池区域开辟一片空间来存储“abc“对象,让后再通过new这步操作将这个对象拷贝到堆内存中的。
回复 使用道具 举报
陈志强 发表于 2013-5-17 21:23
不是的,首先通过new关键字创建一个对象的话,比如是“abc”,会先去常量池中查找是否已经有了”abc”对 ...

哦 我知道了,原来new对象里的是一个常量池中的拷贝对象,那么常量池中的被拷贝对象的地址是不是也会随着一起拷贝过去,感觉new String("abc")这个对象是两个对象复合到一起的一个对象,那么这个对象里是不是有两个地址值呢。
回复 使用道具 举报
如果问题已解决请再次编辑,改为以解决,方便大家看帖,没有就继续追问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马