黑马程序员技术交流社区

标题: 字符串类的一个小问题 [打印本页]

作者: 王廷顺    时间: 2013-5-16 21:15
标题: 字符串类的一个小问题
毕老师的视频里讲字符串类:
String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象。
                            //字符串最大特点,一旦被初始化就不可以被改变。
          
          String s2 = new String("abc");

          //s1和s2有什么区别?
          //s1在内存中有有一个对象。
          //s2在内存中有两个对象。
我的问题是,s2在内存中有两个对象,那这两个对象是怎样存储的?,s2指向的是谁?最好能画图解释。
作者: 曹睿翔    时间: 2013-5-16 21:45
本帖最后由 曹睿翔 于 2013-5-16 22:20 编辑

“不错不错!
及时更改帖子状态,编辑为已解决”
一次性打开太多帖子,回复错了,哈哈
作者: 陈志强    时间: 2013-5-16 22:03
这是一张图解,不是现在画的,但是也是这个问题,希望对你有帮助!

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

字符串.png

作者: 王婷婷    时间: 2013-5-16 22:14
我的理解是:
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:48
王婷婷 发表于 2013-5-16 22:14
我的理解是:
String是一个特殊的类,那么,也有一般类的特点,可以有构造函数,而String类有带参数的构造 ...

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

哦哦,对哦,是 this  
super是子类访问父类中的变量  用的
呃,真不好意思,,没学好哎,,
作者: 王廷顺    时间: 2013-5-17 20:56
陈志强 发表于 2013-5-16 22:03
这是一张图解,不是现在画的,但是也是这个问题,希望对你有帮助!

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

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

哦 我知道了,原来new对象里的是一个常量池中的拷贝对象,那么常量池中的被拷贝对象的地址是不是也会随着一起拷贝过去,感觉new String("abc")这个对象是两个对象复合到一起的一个对象,那么这个对象里是不是有两个地址值呢。
作者: 曹睿翔    时间: 2013-5-19 07:47
如果问题已解决请再次编辑,改为以解决,方便大家看帖,没有就继续追问




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