黑马程序员技术交流社区

标题: 创建对象问题 [打印本页]

作者: 曾辉    时间: 2012-1-17 14:34
标题: 创建对象问题
String str = "yes"   
if (str == "no")
str += "ok"
一共创建了几个对象

作者: 袁野    时间: 2012-1-17 15:17
没有对象啊通过关键词new才能创建出出对象啊
作者: 章春晓    时间: 2012-1-17 17:16
木对象额。。。就一字符串
作者: 章春晓    时间: 2012-1-17 17:16
木对象额。。。就一字符串
作者: 孙海亮    时间: 2012-1-17 17:20
我认为这里面有一个对象!也就是“yes”,而第二句永远是flase,所以第三句就执行不到,那么就不会创建对象了。
作者: 房宝彬    时间: 2012-1-17 17:51
本帖最后由 房宝彬 于 2012-1-17 17:52 编辑

String类比较特殊,它被放在一个特殊的池中。当你声明一个String对象时,系统会检查具体的字符值是否已经存在,如果存在,则不会另开辟空间存。所以:无论你new 了多少个String对象,假设它们的值都是"abc"的话,那么在这个特殊的字符池中也有切仅有一个“abc"而已。 因此该题中有一个对象,接下来的if判断不会返回true,所以该题创建了一个对象。
作者: 张伟~    时间: 2012-1-17 19:48
首先可以肯定,一个对象是有的(yes)
String是一个引用类型的变量String str="yes";其实就是String str=new String("yes");
后面的if语句就像楼上说的返回的是false,str+="ok";根本执行不到
所以只有一个对象
作者: 余松霖    时间: 2012-1-17 22:10
一共创建了两个对象
常量池里边:"yes"
栈内存里边有个str
作者: 黄秋    时间: 2012-1-17 22:39
余松霖 发表于 2012-1-17 22:10
一共创建了两个对象
常量池里边:"yes"
栈内存里边有个str

我觉得是一个对象。
常量池那个不算是对象吧,应是变量。
作者: 老罗    时间: 2012-1-18 12:40
继续讨论哦。
作者: 房宝彬    时间: 2012-1-18 14:11
本帖最后由 房宝彬 于 2012-1-18 14:18 编辑
老罗 发表于 2012-1-18 12:40
继续讨论哦。


老师的意思是  不是1个对象么?
作者: 沈样    时间: 2012-1-19 19:21
一般是new才会产生对象,String这个字符串="XXX"的话,他们在字符串池中取,对象应该是jvm自动开辟,如果String没有new产生的就永远只有一个,如果错了请指教
作者: 黄秋    时间: 2012-1-21 23:32
既然老师说“继续讨论”,我也来说两句。应是一个对象。
  String str = "yes":JAVA首先在字符串池中查找是否已经存在了值为"yes"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
  如果有“new”语句,则创建一对象到堆中,字符串池是保存在栈上。这里无“new”语句,str == "no" 为false,下面的语句不会执行,故只产生一个对象。(如果这三语句前面有语句产生"yes"在字符串池,则一对象也不会产生)。
作者: 荣凯旋    时间: 2012-1-22 15:15
6楼7楼正解
作者: 李杨    时间: 2012-1-31 02:51
public String()
Initializes a newly created String object so that it represents an empty character sequence. Note that use of this constructor is unnecessary since Strings are immutable.

String
public String(String original)
Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.

Parameters:
original - A String

一般来说的话,还是直接String str = "strings";因为字符串在字符串池中是不可变的,就是字符串池中维护着字符串,当你多次使用同一个字符串的时候是直接到字符串池中来拿的,并不会占用多余的空间。用String的构造方法也可以,但是正如刚才强调的字符串池中创建了的字符串是不可变的,所以没有什么必要用new来构造。除非你需要显示的用你的字符串。
作者: 王康    时间: 2012-1-31 09:52
String str=new String("yes");
创建了两个对象
常量池里边:"yes"
栈内存里边有个str

String str = "yes"   
if (str == "no")
str += "ok"
只创建了一个对象"yes"
String str="yes" 与 String str=new String("yes");的创建方法是不一样的含义。我不同意7楼的说法。




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