今天在论坛里看到这个题目,很多人贴的答案都是:两个.解释是:一个是“xyx”,一个是指向“xyx”的引用对象s。  
看不懂啊...."xyz"可以理解,后面那个指向"xyz"的引用对象s怎么解释?s应该是个变量而已啊,在栈中,引用对象"xyz"啊!哪有什么引用对象s?我是这样理解的,是我理解错了,还是别人错了?求教...

解决方案 »

  1.   

    首先你要明白java虚拟机对你的变量是怎样在内存中分配的。在java中一般的变量、基本数据类型和对象的句柄多存放在堆栈里面,堆栈的特点是存取的速度块(详解请楼主看一下think in java这一本书,[email protected])而对象都放在了堆里,上面的意思就是说在堆栈里保存了s在堆里创建了s的对象“xyx”
      

  2.   

    对的,s只是一个引用类型的变量,但是通过new关键字在堆上开辟了空间,此空间存放的对象被s所引用。
    而"xyz"本身就是一个匿名的String对象,一出现即在堆里面开辟了空间并存放在此空间中。
    现在,题目问你,创建了几个String Object? 就等同于现在堆里面有创建了几个对象。你还可以把这个表达式拆开理解
    String s = new String("xyz") 等同于String s = new String();s="xyz";这样堆上创建了几个对象,一看就明白了。
      

  3.   

    注意与
    String s="xyz"的区别,像这样不通过new关键字,堆上只创建了一个String对象。
      

  4.   

    那个解释是错的.
    正确解释是:一个字符串常量池中的"xyz",一个是以这个字符串对象为模板生创建一个内容与之一模一样的字符串对象
      

  5.   


    回复框的上面,可以看一下有多少?都已经成灾了!这个问题是 CSDN Java 版著名的周经帖,每周最少出现一次!
      

  6.   

    毫无疑问 别人说的太书面化了   创建了两个对象 一个是s后无疑问s是一个对象 我肯定你肯定赞同  然后就是new String("xyz")  因为这里有一个new  老师说过 凡是有new关键字 就是创建一个对象的意思
      

  7.   

    http://blog.csdn.net/mengxiangyue/article/details/6818142看看你就懂了
      

  8.   

    http://www3.ntu.edu.sg/home/ehchua/programming/java/J3d_String.html
    英文可以的话,推荐~
      

  9.   

    还真的不少。。谁叫那网上的面试题里总爱出现这题呢。其实这个没什么好考的。也只是JVM做了优化而已
      

  10.   

    两个(一个是“xyz”,一个是指向“xyz”的引用对象s)
      

  11.   

    看看这篇文章吧,其实,我上面说的也不对
    http://www.iteye.com/topic/774673
      

  12.   

    可能是一个,也可能是两个。如果“xyz”已经存在就不再创建了。
      

  13.   

    字符串本身就是以对象的形式储存在字符串常量池中;
    而有用new关键字重新建了一个对象因此是两个。
    我 建议如果的确不理解就先记住以后见的多了自然就明白了。
      

  14.   

    毫无疑问 是两个嘛  一个字符串就是一个String类的匿名对象 但是如果使用的是New关键字 此时会开辟一个新的空间 虽然此时内容还是xyz 但是此时真正使用的New开辟的空间。不用的那个命运就是就等待垃圾回收了。
      

  15.   

    这个问题只能说不一定是2个,有可能是一个。在进行new String("xx")操作时,首先回去String pool中检查是否有xx,若有的话,就会直接在堆中产生一个对象,并返回引用,这个时候实际上是一个对象,若检查出来没有的话,则现在String POOL中创建xx,然后继续在堆中创建一个,并返回堆中的引用,这个时候就是2个对象。
      

  16.   

    常量池中为 "xyz" 堆中为String对象
    栈中为String类型变量String类型变量中保存的是 堆中的String对象的地址,堆中的String对象保存的是常量池中"xyz"的地址
      

  17.   

    String s = new String("xyz"); 一个对象 是在创建  s  对象 时候,在堆里分配了空间, new String(指向"xyz") 另一个对象字符串常量"XYZ",也在堆里面new String()  里面放的是   对象"xyz"的地址