public String makinStrings()
{
String s = "Fred";
s = s + "47";
s = s.substring(2, 5);
s = s.toUpperCase();
return s.toString();
}
How many String objects will be created when this method is invoked?
我认为有"Fred" "47" "Fred47" "ed4" "ED4" 这5个对象被创建,但是为什么答案是选3个对象被创建?是不是答案错了啊

解决方案 »

  1.   

    创建对象的是以下3句:
    String s = "Fred";
    s = s + "47";
    return s.toString();1,3两句不用说了,
    第二句等号右边的s是新建的,和47相连后,把它的引用(即指针地址)赋给了等号左边的s(即String s = "Fred";这句创建的s)s = s.substring(2, 5);
    s = s.toUpperCase();
    这两句也一样,只是引用改变了
      

  2.   

    "Fred" "47" "Fred47"我觉得是这三个对象被创建了
    剩下那两个是在现有对象的基础上改变的。。不算创建的。。
      

  3.   

    楼主的想法没错,答案错了。zhxjcooler说的完全不对,不用管他。
    String s = "Fred";//"Fred"常量对象
    s = s + "47";//"47"常量对象,s+"47"使用一个StringBuffer来完成加法操作,StringBuffer最后转为一个新的String。
    s = s.substring(2, 5);//substring函数最后会有一个new String操作,具体可以看JDK源码。
    s = s.toUpperCase();//同上
    return s.toString();//return this;没有新对象不过"Fred"和"47"好像是在常量池中建的对象,不知道算不算代码中创建的。如果不算的话就是3个。
      

  4.   


    楼主的想法没错,答案错了。zhxjcooler说的完全不对,不用管他。
    String s = "Fred";//"Fred"常量对象
    s = s + "47";//"47"常量对象,s+"47"使用一个StringBuffer来完成加法操作,StringBuffer最后转为一个新的String。
    s = s.substring(2, 5);//substring函数最后会有一个new String操作,具体可以看JDK源码。
    s = s.toUpperCase();//同上
    return s.toString();//return this;没有新对象不过"Fred"和"47"好像是在常量池中建的对象,不知道算不算代码中创建的。如果不算的话就是3个。
    s指向了新对像.Fred等成为垃圾!