今天笔试碰到这么一个题目,MS很经典:
String s = new String("xyz");创建了几个String Object?
看给出的答案说是两个,偶就想不明白了。
难道说把里面那个“xyz”也算是一个对象?
可是我觉得“xyz”应该做为常量字串存放在静态区阿,
不应该算做对象阿。
s就更不可能了,它只是一个reference嘛。
请大虾帮忙指点9偶一下!!
String s = new String("xyz");创建了几个String Object?
看给出的答案说是两个,偶就想不明白了。
难道说把里面那个“xyz”也算是一个对象?
可是我觉得“xyz”应该做为常量字串存放在静态区阿,
不应该算做对象阿。
s就更不可能了,它只是一个reference嘛。
请大虾帮忙指点9偶一下!!
String s = new String("xyz");//never do this!
String s = "xyz";//do this!
xyz 是一个对象
new String()又是生成一个对象
s只是指向这个新生成的对象,其不是对象;对象是放在堆内存中的,而不是栈内存中的
-------等于-------String s = new String();
s = "xyz";
../两个
其实“xyz”就相当于C++中的无名对象,
然后String构造函数进行对象拷贝的。
多谢各位!
(2)创建一个字符串值为"xyz"的String型对象
(3)将s指向步骤(2)中所创建的对象的地址所以,创建了两个对象
那么答案应该是2或者3了吧?对于String s = "xyz";,Java将其内部工作分为三个步骤:
1.先定义一个名为s的对String类的对象引用变量:String s;
2.在栈中查找有没有存放值为"xyz"的地址,如果没有,则开辟一个存放字面值为"xyz"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"xyz"的地址,则查找对象o,并返回o的地址。
3.将引用s指向对象o的地址。
像C#已经不允许写成String s = new String()了