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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马姜硕 黑马帝   /  2011-12-16 23:25  /  3808 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字符串类型只要赋值后就不可以改变了 那么下面的代码用ToLower转换完的结果怎么还是可以赋给字符串变量本身呢就是还是把大写的"JAVA"转换后的结果也就是小写的"java"给了str1 那str1值不就变了么?????
string str="java"
string str1="JAVA"
str=str.ToLower()
str1=str1.ToLower()

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

7 个回复

倒序浏览
周胜 黑马帝 2011-12-16 23:37:36
沙发
String 声明的是一个地址,当你改变它的值时,不是重新给它赋值,而是重新申请了一个地址。
也就说:你是申请另外一个变量。

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
那么这两个地址都在内存中存着么 下次再调用str1 调用的是那个地址的值呢
回复 使用道具 举报
周胜 黑马帝 2011-12-18 13:41:48
板凳
黑马姜硕 发表于 2011-12-17 13:35
那么这两个地址都在内存中存着么 下次再调用str1 调用的是那个地址的值呢

str1的地址已经被改变了,此地址指向"java"这个字符串,下次调用就调用这个地址。。
回复 使用道具 举报
陆亚 黑马帝 2011-12-18 23:23:55
报纸
涉及到变量与地址的关系。对字符串运算时,实际上是在内存中临时申请一个匿名变量,str=str.ToLower();
内存中有一个临时的变量保存str.ToLower()的值,结束后str重新指向这个临时变量的地址,因此看上去好像是可以重新赋值。
内部经过这个过程,效率不是太高。

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 使用道具 举报
首先string是一个类,这个和其他的一些基本的数据类型不同,string是引用类型,而如int double float等是值类型,string在内存中存储的不是某一个特定的字符串,而是一个指向字符串的引用,之所以说赋值后内容不能更改,不是因为string的这个变量不能更改,而是它指向的那个字符串不能更改,如果这个string的变量已经指向了一个特定的字符串,如果这是它指向另一个字符串,那么这个string的变量的值就会改变,那么你如果理解了上面的,你的问题就很容易了,首先你要知道toLower()方法返回一个字符串,相当于在原有的字符串基础上进行加工处理后又重新生成了另一个字符串,我们用原来指向原字符串的那个string变量去引用那个处理过新生成的字符串,最后显示的结果就是,我们用的还是原来的那个string变量,只是它引用的不再是原来的字符串(大写),而是处理过的新生成的字符串(转换成小写).....

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
刘冠杰 黑马帝 2011-12-26 23:40:03
8#
其实刚开始你就误解了,并不是说字符串类型的值不可以改变,而是,一单你声明了一个变量为字符串类型,那么它就在同一个方法或者属性里边只能是字符串类型,不能再给它重新声明成其他的数据类型!

而你所说的字符串的值不可以改变,这点是误解的,字符串的值和平时我们声明的数据类型是一样的,就像Int类型,你刚开始可以给一个变量a赋予1个值,然后可以再对它的值进行重新赋值,那么它原来的值也就被新赋的值给覆盖了!
如:
int a=10;
a=20;
像这样,刚开始a赋予的值是10,后来依然可以重新给它赋值,只是不能重新声明a为其他类型了。
如:
int a=10;
string a;
这样就是错的了!

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马