String sb=new String();
for (int j=0;j<w;j+=)
{
sb=sb+'*';
}
我想sb=sb+'*';应该会报错的sb是String常量,是不能修改的,但是为什么却又通过了编译???
有人说每执行sb=sb+'*'都会生成一个新的sb,这是为什么呢?前面已经有了sb这里为什么还要每次都生成新的sb呢?如果是下面的还好理解:
for (int j=0;j<w;j+=)

String sb=new String();
sb=sb+'*';
}每次生成的新的sb还好理解。

解决方案 »

  1.   

    for (int j=0;j<w;j+=)
    {
    sb=sb+'*';
    }sb只是一个引用 指向一个String对象
    sb = sb+'*',做着个运算时
    sb 所指向的那个String不能变 ,但是sb只是一个引用,可以指向另外一个对象,
    String不能变,和sb不能变是两回事
      

  2.   

    如果想让引用sb也不变, 可以加上final关键字, 它就指不了别的对象了.
      

  3.   

    String类型不能改变,sb只是一个String类型的对象,所有对象都是引用,当+*的时候,sb对象把指针指向其它的引用了。每次赋值的确会生成新的对象,但是这个对象不是sb
      

  4.   

    要分清对象和对象的引用.字符串对象本身不变不意味着字符串的引用不能变.进行new操作或者对字符串的连接操作每次都将生成新的字符串对象并返回其引用,这个引用是可以赋给任一字符串对象的引用.
      

  5.   

    在java中String是不能被改变的,实际上java在执行字符串操作的时候进行了下列操作:
    String s1="hello";
    String s2="world";
    int i=2;
    String s=s1+s2+i;//实际上java会这样操作:
                     //new StringBuffer().append(s1).append(s2).append(i).toString();
    String是不能被改变的,所以需要创建一个StringBuffer,StringBuffer是可以被改变的。
    楼主的sb变化了,是因为每次循环之后sb都指向了一个新的StringBuffer.如2楼所说。