黑马程序员技术交流社区

标题: 关于引用和对象! [打印本页]

作者: 黄方    时间: 2012-3-9 22:41
标题: 关于引用和对象!
String  s=new String("xyz") ;问问大家这儿到底创建了几个String Object啊?
作者: 房宝彬    时间: 2012-3-9 22:42
创建 几个String Object? 什么意思?
作者: 黄方    时间: 2012-3-10 00:15
房宝彬 发表于 2012-3-9 22:42
创建 几个String Object? 什么意思?

就是String类型的对象呗!!
作者: 房宝彬    时间: 2012-3-10 00:19
黄方 发表于 2012-3-10 00:15
就是String类型的对象呗!!

这要看常量池里有没有xyz,如果有的话则创建一个对象,如果没有的话就创建2个对象

作者: 贠(yun)靖    时间: 2012-3-10 00:23
一个new只能创建一个对象  s引用变量 指向了new String("xxx");   的内存地址  这绝对没问题  
而String s="xxx" ; 虽然也是一个对象  但我觉得应该只有一个对象
    s是一个引用 他只能存放一个内存地址  如果是两个对象的话  有两个内存地址  你说s到底指向谁呢?
         所以我认为是一个对象的   
不知道其他人有什么看法     待观望中  呵呵
作者: 小白    时间: 2012-3-10 08:20
2个对象!
作者: 黄方    时间: 2012-3-10 12:16
小白 发表于 2012-3-10 08:20
2个对象!

为何呀?
作者: 陈汉帆    时间: 2012-3-10 18:51
"xyz”一个,new String("xyz”)又一个,但s指向new String("xyz”)的对象
作者: 许圣建    时间: 2012-3-10 21:03
本帖最后由 许圣建 于 2012-3-10 21:07 编辑
这要看常量池里有没有xyz,如果有的话则创建一个对象,如果没有的话就创建2个对象

版主正解。
我补充些细枝末节:
String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,
就是因为如此,才说String类型是不可变的(immutable)。
String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("xyz")实际创建了2个String对象,
一个是"xyz"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同,
一个是编译期,一个是运行期!
增加一道题以便说清楚:
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面创建了几个String对象?
答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
(用new创建的每new一次就在堆上创建一个对象,用引号创建的如果在常量池中已有就直接指向,不用创建)
作者: 冯旭君    时间: 2012-3-10 22:34
我先不说 创建几个对象,说说基本过程。String str = "aaa";此句话,首先会查找字符串池中会否有"aaa"对象,如果没有先创建对象然后加入到字符串池中;String str = new String("aaa");首先会先创建对象,然后查看字符串池中有没有此字符串,如果没有就加入池中,有就不加入。




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