黑马程序员技术交流社区

标题: 关于String s = new String("abc"); [打印本页]

作者: qiucheng1990    时间: 2012-10-26 07:23
标题: 关于String s = new String("abc");
为什么说s在内存中有两个对象呢,那么s存放的是哪个对象的首地址呢?内存中都有什么池,字符串在常量池中是按char分开存储的吗


作者: 何创    时间: 2012-10-26 07:45
abc 是字符串的常量,出现“abc"就在内存中创建了这个字符串,把它用new关键字给了s时等于是一个新的对象s所以是两个对象。内存中有常量池和对象池。
作者: 刘学宾    时间: 2012-10-26 09:27
在内存里面有常量池和对象池
作者: 高正新    时间: 2012-10-26 09:50
本帖最后由 水木桶 于 2012-10-26 09:53 编辑

学习初期主要理清两个,堆内存与栈内存就可以了。
String是一个类,你通过new String("abc");就是在堆内存中开辟新空间实例化一个String对象。
具体如下图:


作者: 赵红萍    时间: 2012-10-26 21:49
String s = new String("abc")
new String("abc"),创建了一个String类型的对象,但是没有名字,这个对象指向存放字符串abc的那块内存,然后又创建了一个Sting类型的对象,对象名字是s,用s代表了那个没有名字的对象.
作者: 张其辉    时间: 2012-10-26 23:05
其实创建字符串对象有三种方法:
1、String s="name";创建一个字符串对象,内容为name
2、String s=new String();创建一个内容为空的字符串对象
3、String s=new String("name");创建一个字符串对象“name”
第三种是两个对象,因为“name”本身就是一个对象了,s作为一个新的对象,其实他的对象内部存了“name”对象的地址,这个地址指向了“name”对象;
作者: 任雷彬    时间: 2012-10-27 14:47
String s = new String("abc");

String s其实创建了两个对象,在编译期间java会把字符串“abc”放到字符串池的地方,在字符串池中所有相同的字符串会共享同一个内存空间。所以此时字符串“abc”就是一个对象。
new关键字的作用是通知编译器为对象分配内存空间,同时返回对象的引用,所以此时 对象的引用 s 指向new所通知编译器的分配的内存空间,  s  指向新建对象的首地址,而不是  字符串池对象的首地址。





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