A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高美云 黑马帝   /  2011-11-4 21:13  /  2319 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字符串最大的特点是初始化不可以改变,那些请问大家;
String s="abc";
s="kk";
编译通过,并且输出结果是kk,这是为什么呢??

10 个回复

倒序浏览
s 只是一个对象引用,原先指向对象“abc”,但重新赋值后会指向对象“kk”

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
其实,abc这个对象没有变化,其实是s变化了,只不过现在s指向了kk这个对象。abc和kk这两个对象的内容都没有变化。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
初始化不可以变....... 你设的也不是常量怎么不可以变  重新赋值  后者不就覆盖前者吗!
回复 使用道具 举报
引用不可变,,原引用 abc,现在是个新引用 kk,,两块地址 放两个数据

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
在栈内存中节省内存共享一个引用
回复 使用道具 举报
qy 来自手机 黑马帝 2011-11-4 22:29:35
7#
原来的字符串是没有改变。只是在内存中又申请了一块地方,简单的说是同一个变量指向了不同的内存地址。
回复 使用道具 举报
新创建的对象覆盖了,以前对象没用了,被垃圾回收站给回收了
回复 使用道具 举报
喻尚健 黑马帝 2011-11-5 00:16:13
9#
String s="abc";
s="kk";
实际上创建了2个对象,对于不可变类,当声明新类,或对类的值做出修改的时候它都会创建一个新的类,然后再进行赋值。
回复 使用道具 举报
成杰 黑马帝 2011-11-5 08:54:36
10#
只是一个地址指向问题,先指向“abc”的地址,然后指向“kk”的地址
回复 使用道具 举报
s是存在栈内存中的一个引用变量,初始化时s指向堆内存中的abc,s=“kk”后,s的所指向改变为 指向堆内存kk,s中存储的地址改变了而已,堆内存中的数据不会改变,所以初始化并不会改变!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马