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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程媛媛 中级黑马   /  2013-3-19 20:58  /  1413 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程媛媛 于 2013-3-20 15:21 编辑

String str = new String("Hello"); 创建了2个对象,这是为什么?请大家帮忙解答。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

6 个回复

倒序浏览
String str = new String("Hello"); 在内存中有两个对象,可以看成"Hello"和new String()

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
首先new一个对象,这个是很容易理解的,再调用构造函数对其进行初始化。初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。

点评

不是副本哦~  发表于 2013-3-20 15:48
回复 使用道具 举报
本帖最后由 全超 于 2013-3-19 22:29 编辑

两个对象,一个是“hello”字符串对象,一个是存放指向“hello”字符串对象地址的引用对象str。这里String是类是引用数据类型!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
new的时候,str的初始值默认为null。因为String是引用类型数据。默认值是null、这是一个对象。然后又将"hello”调用,又一个对象。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
    一般情况下,创建对象时通过new关键字创建出来的,但是有的时候会通过一个方法返回类的实例对象,比如单例模式就是通过public static Object getInstance()方法得到的对象,但是这个方法内部也是new出来对象的。所以综上一般情况下都是通过new出来对象的。但是String类确实属于比较另类的一个,因为当你String str = “hello”;的时候就也会创建对象,但这个字符串对象会放在常量池中,供以后访问同样的字符串时调用。
    所以,String str = new String("hello")这句代码,首先是在常量池中创建了“hello”对象,在在堆内存中创建String对象(引用str存在栈内存中),并把常量池中对象“hello”的引用传递给String,所以如此下来是创建了两个对象。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马