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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qiucheng1990 中级黑马   /  2012-10-26 07:23  /  2050 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么说s在内存中有两个对象呢,那么s存放的是哪个对象的首地址呢?内存中都有什么池,字符串在常量池中是按char分开存储的吗

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

6 个回复

正序浏览
String s = new String("abc");

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

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
其实创建字符串对象有三种方法:
1、String s="name";创建一个字符串对象,内容为name
2、String s=new String();创建一个内容为空的字符串对象
3、String s=new String("name");创建一个字符串对象“name”
第三种是两个对象,因为“name”本身就是一个对象了,s作为一个新的对象,其实他的对象内部存了“name”对象的地址,这个地址指向了“name”对象;
回复 使用道具 举报
String s = new String("abc")
new String("abc"),创建了一个String类型的对象,但是没有名字,这个对象指向存放字符串abc的那块内存,然后又创建了一个Sting类型的对象,对象名字是s,用s代表了那个没有名字的对象.
回复 使用道具 举报
本帖最后由 水木桶 于 2012-10-26 09:53 编辑

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

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
在内存里面有常量池和对象池
回复 使用道具 举报
abc 是字符串的常量,出现“abc"就在内存中创建了这个字符串,把它用new关键字给了s时等于是一个新的对象s所以是两个对象。内存中有常量池和对象池。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马