今天笔试碰到这么一个题目,MS很经典:
String s = new String("xyz");创建了几个String Object?
看给出的答案说是两个,偶就想不明白了。
难道说把里面那个“xyz”也算是一个对象?
可是我觉得“xyz”应该做为常量字串存放在静态区阿,
不应该算做对象阿。
s就更不可能了,它只是一个reference嘛。
请大虾帮忙指点9偶一下!!

解决方案 »

  1.   

    "xyz"当然算一个string对象了
    String s = new String("xyz");//never do this!
    String s = "xyz";//do this!
      

  2.   

    String s = new String("xyz");
    xyz 是一个对象
    new String()又是生成一个对象
    s只是指向这个新生成的对象,其不是对象;对象是放在堆内存中的,而不是栈内存中的
      

  3.   

    String s = new String("xyz");//
    -------等于-------String s = new String();
    s = "xyz";
    ../两个
      

  4.   

    哦,经过指点,终于明白了。
    其实“xyz”就相当于C++中的无名对象,
    然后String构造函数进行对象拷贝的。
    多谢各位!
      

  5.   

    String s = new String("xyz");内部工作:(1)先定义一个名为s的对String类的对象引用变量:String s;
    (2)创建一个字符串值为"xyz"的String型对象
    (3)将s指向步骤(2)中所创建的对象的地址所以,创建了两个对象
      

  6.   

    另外,如果是:String s = "xyz";
    那么答案应该是2或者3了吧?对于String s = "xyz";,Java将其内部工作分为三个步骤:
    1.先定义一个名为s的对String类的对象引用变量:String s;
    2.在栈中查找有没有存放值为"xyz"的地址,如果没有,则开辟一个存放字面值为"xyz"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"xyz"的地址,则查找对象o,并返回o的地址。
    3.将引用s指向对象o的地址。
      

  7.   

    "xyz"其实是匿名对象
    像C#已经不允许写成String s = new String()了