黑马程序员技术交流社区

标题: 创建了多少个对象? [打印本页]

作者: 刘琦    时间: 2013-3-16 12:58
标题: 创建了多少个对象?
本帖最后由 刘琦 于 2013-3-17 17:24 编辑

String s = new String("678");创建了几个String object?在多线程那里涉及了很多类和对象,到底是怎么去考虑创建了多少个对象呢?

作者: 黑马-郑玉元    时间: 2013-3-16 13:18
不就是一个对象么!!或许我的理解比较浅薄!
new了一个string,调用它有参数的构造方法。
我是这么简单的理解的!
作者: 姓名长度不符    时间: 2013-3-16 13:23
有几个new,就新建了几个对象
作者: 范天成    时间: 2013-3-16 14:06
俩?我猜的{:soso_e144:}
作者: 唐永康    时间: 2013-3-16 14:44
String s = new String("678");创建了几个String object?在多线程那里涉及了很多类和对象,到底是怎么去考虑创建了多少个对象呢?


老实说,就你这句话String s = new String("678"); 是创建了两个对象,首先有一个new 关键字就表示创建了一个对象,其次String s = "678";也是创建了一个对象。
从这个方面说,上网的那句话已经创建了两个对象。

而在多线程里面,由start开启一个线程,如果在线程代码块里面创建对象,那么每开启一次线程就会创建一个对象,这里就需要去run方法中到底是new 了几个对象了。




作者: 郝强勇    时间: 2013-3-16 17:30
    一般情况下,创建对象时通过new关键字创建出来的,但是有的时候会通过一个方法返回类的实例对象,比如单例模式就是通过public static Object getInstance()方法得到的对象,但是这个方法内部也是new出来对象的。所以综上一般情况下都是通过new出来对象的。但是String类确实属于比较另类的一个,因为当你String str = “678”;的时候就也会创建对象,但这个字符串对象会放在常量池中,供以后访问同样的字符串时调用。
    所以,String str = new String("678")这句代码,首先是在常量池中创建了“678”对象,在在堆内存中创建String对象(引用str存在栈内存中),并把常量池中对象“678”的引用传递给String,所以如此下来是创建了两个对象。
作者: 刘凯    时间: 2013-3-16 19:34
唐永康 发表于 2013-3-16 14:44
老实说,就你这句话String s = new String("678"); 是创建了两个对象,首先有一个new 关键字就表示创建了 ...

假设在最后一个所有线程都创建字符串前,前边的线程都还没死,且常量池中 的“678”未成垃圾被收回,那么个人认为是 线程个数+1个对象 个人认为是   如楼上所说  当第一个线程String str = “678”;的时候就也会创建对象,但这个字符串对象会放在常量池中,供以后访问同样的字符串时调用。 再有个线程来执行String str = “678”;语句时,由于常量池里已经有了 “678”这个字符串常量了,所以就不必在创建该对象,只需指向就行了 ,而String s = new String("678");是每个线程必须创建一次 放入堆内存中去的   所以 说是线程数+1次   
个人见解
作者: 陈丽莉    时间: 2013-3-16 19:49
若还有问题,请继续追问;没有了的话,请将帖子分类改成【已解决】~
作者: 刘凯    时间: 2013-3-16 19:56
陈丽莉 发表于 2013-3-16 19:49
若还有问题,请继续追问;没有了的话,请将帖子分类改成【已解决】~

这个好多句话 你也不给分{:3_63:}




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