黑马程序员技术交流社区

标题: 关于创建对象的问题? [打印本页]

作者: 程媛媛    时间: 2013-3-19 20:58
标题: 关于创建对象的问题?
本帖最后由 程媛媛 于 2013-3-20 15:21 编辑

String str = new String("Hello"); 创建了2个对象,这是为什么?请大家帮忙解答。
作者: 牛合超    时间: 2013-3-19 21:05
String str = new String("Hello"); 在内存中有两个对象,可以看成"Hello"和new String()
作者: 黑马-郑玉元    时间: 2013-3-19 21:08
首先new一个对象,这个是很容易理解的,再调用构造函数对其进行初始化。初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
作者: 全超    时间: 2013-3-19 22:25
本帖最后由 全超 于 2013-3-19 22:29 编辑

两个对象,一个是“hello”字符串对象,一个是存放指向“hello”字符串对象地址的引用对象str。这里String是类是引用数据类型!
作者: lxww    时间: 2013-3-19 22:40
new的时候,str的初始值默认为null。因为String是引用类型数据。默认值是null、这是一个对象。然后又将"hello”调用,又一个对象。
作者: 陈丽莉    时间: 2013-3-20 04:03
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~
作者: 郝强勇    时间: 2013-3-20 09:23
    一般情况下,创建对象时通过new关键字创建出来的,但是有的时候会通过一个方法返回类的实例对象,比如单例模式就是通过public static Object getInstance()方法得到的对象,但是这个方法内部也是new出来对象的。所以综上一般情况下都是通过new出来对象的。但是String类确实属于比较另类的一个,因为当你String str = “hello”;的时候就也会创建对象,但这个字符串对象会放在常量池中,供以后访问同样的字符串时调用。
    所以,String str = new String("hello")这句代码,首先是在常量池中创建了“hello”对象,在在堆内存中创建String对象(引用str存在栈内存中),并把常量池中对象“hello”的引用传递给String,所以如此下来是创建了两个对象。




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