http://zhidao.baidu.com/question/289430162.html
String s=new String("xyz")究竟创建了几个String Object? 2个?哪2个?答对有奖
大家说清楚点 哈 ,我来终结下这个问题。。。集思广益哈,求说出这个创建的详细过程
2011-07-08 10:37
提问者采纳
是2个不假。 一个是编译时决定的,最后放在常量池中。一个是运行时放在堆里面的。两个都是"xyz",我只能这么说了。还有的,s确实只是一个引用,本身不是对象。java不是纯粹的面向对象,也就是说并不是所有的都是对象,如基本类型等,没清楚的再问我吧
-
追问
-
哈 我认同这位大侠的。。。。。。若果编译期间常量池已经有“xyz”对象的话,那么这个就可能创建一个对象吧。。。是不是?
-
回答
-
常量池中只可能只有一个“xyz”,但是堆中可能有多个,因为你这里用了new String来强制在堆中再创建了一个对象,所以是两个哈;如果是String s= "xyz"这样的,s这个引用就会直接指向常量池的"xyz",而不会是指向你在堆中创建的“xyz”。
-
追问
-
呵呵 说的好!!!上面3位都有都有研究。。呵呵我看了好多都是说s是对象的,无语。。。。今天就把这个疑问给结了
-
回答
-
最后再说加一句吧,对于String 这种不可变对象,有几个对象真正的不会对程序有影响,你们都太认真了,太纠结了。要了解java中的对象等东西,建议看一下java虚拟机的教材,这个不是说你工作多久就清楚的,我敢说现在没多少人清楚自己在用些什么!
-
提问者评价
-
谢谢2楼 3楼 ,1小菜鸟也该好好看看书。。。。。哈哈哈
评论(14)
|
56
按默认排序|按时间排序
其他6条回答
昨天有网友说java一切皆是对象,这句不错。 你哪个很明显是3个对象阿! "xyz"是一个 String s又是一个, new String(“xyz”)又是一个
-
追问
-
大侠 你确定?
-
回答
-
哈哈。肯定错误阿。应该是2个。玩玩,一会给你好好解释下2个的原因。 String s = new String( "xyz "); 首先在string池内找,找到?不创建string对象,否则创建, 这样就一个string对象 遇到new运算符号了,在内存上创建string对象,并将其返回给s,又一个对象 所以总共是2个对象
-
追问
-
楼下给的解释 你赞同吗?
-
回答
-
哈哈。很不错的答案!! 个人认为2楼的说的更加明白 2个的原因是: 一个是你的Class被CLassLoader加载时,你的"xyz"被作为常量读入,在constant pool里创建了一个共享的"xyz" , 然后,当调用到new String("xyz")的时候,会在heap里创建这个new String("xyz");
评论(1)
|
3
2个 “xyz”一个 new String() 一个 s不是,只是引用
-
追问
-
哈 这位仁兄快接近答案了,说详细点
-
回答
-
??难道不是2个??
-
追问
-
你不觉得有可能是1个 或者2个?
-
回答
-
为什么不确定?? 应该就是2个
-
追问
-
有没有一个的可能?
-
回答
-
没有。不用多想了。 另外 1楼在瞎扯,他2年的确白混了,根本不懂 引用和对象的区别。 String s 里的s 只是一个引用,它相当于“门牌”,只是用来指向“房子”,也就是对象的。 它的作用和c里的指针类似,但是一些细节特性上有差别,不过这个不是c#和java里有必要去考虑的。
评论(1)
|
8
有2个String对象 "xyz"是一个 String s又是一个, 我要大奖
-
追问
-
。。。。。。。。s是对象吗?
-
回答
-
对,s是一个对象
-
追问
-
是吗?
-
回答
-
你还怀疑。。。我疯了 绝对没错,错了我就白混2年了
-
追问
-
今天我翻了下java编程思想4,发先他说s不是对象,它只是句柄或者说是引用。。。。。。。。而却s存在栈里,不对堆里。。。。。栈能存对象?栈好像只能存基本类型 和对象句柄 (也就是s罗)
-
回答
-
String s; 这样是不是又1个s对象? s的值是"xyz",懂了没? 举例List list = new ArrayList(); 这样是不是一个list对象啦。
-
追问
-
不知道是你不懂,还是我不懂。。。。。。。求大侠解释。。。。。。。。
-
回答
-
s是引用对象