黑马程序员技术交流社区

标题: 不好意思,一个小问题,求解!!!! [打印本页]

作者: 李小丰    时间: 2012-2-6 14:23
标题: 不好意思,一个小问题,求解!!!!
如代码
String s=aaa;
s=s+bbb;
s所指向的对象改变了吗?
作者: 余海龙    时间: 2012-2-6 14:33
改变了。

字符串属于一个常量,在内存中一旦被初始化就不能改变,
楼主你的意思应该是:s=s+"bbb";
当字符串s在后面加上了字符串“bbb”时,原来的字符串对象“aaa”在堆内存中是不会改变的,而是重新在堆内存中创建了以个字符串“aaabbb”的对象。并将新创建的对象的首地址值赋给了s;
即s此时指向了一个新的字符串对象"aaabbb".

作者: 成果    时间: 2012-2-6 14:39
S指象的对象当然改变了。String是属于一个常量。。s=s+bbb;相当于调用了stringbuffer类对字符串进行了增加。最要S是指向aaabbb。其中创建了多个string对象。

作者: 李泽霖    时间: 2012-2-6 15:01
string类被定义成final类型,一旦创建就不能修改,只能在堆中另创建另一个对象了,所以定义s=s+bbb;,s指向aaabbb这个对象
作者: 易伟    时间: 2012-2-6 15:20
s指向的对象肯定改变了。
s = s + "bbb";这个语句执行后就新创建了对象"aaabbb",并把存储这个对象的地址传给了s.
而原先String s = "aaa";创建的对象依然还存在内存当中,并没有什么改变。重要的是要知道这是两个不同的对象。
作者: 何洪森    时间: 2012-2-6 15:20
首先,你应该所写的代码应该是String s = "aaa";s=s+"bbb";如果不加""编译就不能通过,因为你定义的是一个String类型。还有就是s所指向的对象当然改变了,起初s所指向的对象是字符串"aaa",然后s=s+"bbb";语句过后,字符串"aaabbb"就传递给了引用变量s,其s所指向的对象就变成了字符串"aaabbb";
作者: 刘基军    时间: 2012-2-6 16:19
使用:
  System.out.println(s);
测试一下就知道了。
作者: 彭沛东    时间: 2012-2-6 17:00
  貌似楼主代码有误,String s="aaa"; s += "bbb";
             String s= "aaa" :这个s是指向"aaa"在内存的地址.
              s += "bbb"      :这个是在内存中新开一片内存、在重新把"aaabbb"的内存地址赋值给s
所以s所指的内存地址是改变了的。
作者: 【专】【属】    时间: 2012-2-7 20:01
S所指的对象变了。

作者: 毛溯澜    时间: 2012-2-8 16:47
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
String 类在java中的定义public final class String,是常量;它们的值在创建之后不能更改。

当字符串s在后面加上了字符串“bbb”时,原来的字符串对象“aaa”在堆内存中是不会改变的,而是重新在堆内存中创建了以个字符串“aaabbb”的对象。并将新创建的对象的首地址值赋给了s;
即s此时指向了一个新的字符串对象"aaabbb".



作者: 任增涛    时间: 2012-2-10 19:01
同学,以后遇到这样的问题你可以这样做!
首先你的代码问题:String s=“aaa”;s=s+“bbb”;
我不知道你说的对象是什么意思;如果你说的是值的话那么一定是变了!因为一个是aaa,一个是aaabbb嘛。
如果你说的是地址的话:是这样aaa的地址肯定不会变!,就算你做了s=s+"bbb"' aaa的地址也不会变!因为初始化的地址是不变的!但是在生成这样字符串"aaabbb"时,内存会给他一个新的地址!为什么:你肯定会想直接加在后面不就得了,干嘛还要找个新的地方!很简单:因为以前那个地址所拥有的空间不够大,初始化的空间不会变!它放不下那么多的东西呀!所以我们要找一个更大的空间呀!然后再放aaabbb!最后s指向新的地址!s的地址变了!我想这也是在字符串空间没有减这一运算的原因吧!这是我的理解。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2