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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于世德 中级黑马   /  2013-7-11 16:36  /  1569 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. String s  = new String();
  2. s += "\u0000";
复制代码
String类是final类,上面的代码为什么可以改变它的内容呢?,还有String类中的replace、toUpperCase也可以改变它本身的内容吗?"\u0000"这个转义字符是放在双引号的,这也可以转义吗?它和'\u0000'有什么区别呢?

7 个回复

正序浏览
吴光新 黑马帝 2013-7-11 21:04:54
8#
本帖最后由 Jiewin 于 2013-7-12 04:22 编辑

输入是final类,但是 "\u0000"是一个常量,而s += "\u0000";不是改变原有值,而是重新产生一个栈内存的引用地址。s的指向改变了。
楼主可以再改变了s对象的引用指向后用s.hashCode()打印一下,将会明白。
String s  = new String();  
这句是在栈内存中产生一个变量s,堆内存中产生了一个String类型的空间,该空间的内容为空。如果这时你打印s,将为空,就相当于"",长度当然是0了,

s += "\u0000";
当读到这里时,就已经在堆内存中产生了一个"\u0000",而这时s的引用就指向了"\u0000",不再是原来的长度为0的那个空间了,\是一个转义符,把后面的转义成了一个字符,可能是空" ",也可能是一个字母,或一个汉字,看后面跟的是什么了。所以可以使用''单引号,就像上面那哥们说的,如果你多放两个如'\u0000\u0000',那么里面就是2个字符了,当然不能使用单引号。

replace(),也不可以改变里面的字符串,而是用新的的字符串替换指定的旧的字符串,再重新产生一个新的字符串,如果指定的字符串在原来字符串里没有,就无法生产新的字符串。

toUpperCase(),只能引用原有字符串产生一个新的字符串并转换成大写,如果s是"\u0000"这样的或者"",toUpperCase返回的也是空。

回复 使用道具 举报
final用于声明属性、方法和类时,分别代表属性不可改变,方法不可覆盖,类不可继承
回复 使用道具 举报
张歆明 发表于 2013-7-11 17:15
final修饰类  就是不能被继承  
而String 常量"xxx"或者 "abc"之类的  是存在于方法区的常量池  这个是常 ...

String类对象的值都在常量区吗?如果是在堆区,应该可以改变这个值把?
回复 使用道具 举报
于世德 发表于 2013-7-11 17:06
那平时所说的String类的内容不可改变是为什么呢?finall只是限制该类不会被继承 ...

final修饰类  就是不能被继承  
而String 常量"xxx"或者 "abc"之类的  是存在于方法区的常量池  这个是常量的特点   但是 没有说  String str ="abc";  之后str不可以改变引用的地址   str还可以指向其他的String常量
回复 使用道具 举报
张歆明 发表于 2013-7-11 16:51
***********************************String类是final类,上面的代码为什么可以改变它的内容呢?
还有Strin ...

那平时所说的String类的内容不可改变是为什么呢?finall只是限制该类不会被继承
回复 使用道具 举报
***********************************String类是final类,上面的代码为什么可以改变它的内容呢?
还有String类中的replace、toUpperCase也可以改变它本身的内容吗?
"\u0000"这个转义字符是放在双引号的,这也可以转义吗?
它和'\u0000'有什么区别呢?
**********************************
注意 楼主
(1). final  修饰变量  这个变量是常量  之不能被修改
final 修饰类  这个类不能被继承  一个类不能被继承和这个类的对象的引用是不是常量引用是不相干的   
并不是这个类是final类  它的引用也跟着就是final的了
区分下情况就OK

(2). replace  toUpperCase返回值就是String类的引用 所以  他并没有改变这个调用方法的字符串对象的内容
String x =str.replace(, ); 这就没改变str指向对象的内容
如果  str  =str.replace(, ); 仅仅是改变了这个str指向的对象  从原来的堆内存的对象  换到了由replace或者toUpperCase方法产生的堆内存中新的对象u00

(3). 这个\u u的意思是Unicode 的意思 \u0000这个是一个整体  本身是一个 Unicode编码值为0000对应的字符  不是转义 是一个整体   你可以打印System.out.println('\u0000');//单引号哦!
单个字符既可以放在''里面  也可以放在""  "\u0000\u0001\u0002"   但是  ''里面只能放一个字符  '\u0000' 或者'\u0001' 或者'\u0002'  如果 '\u0000\u0001' 编译就会出错!

回复 使用道具 举报
是s这个引用指向了新的字符串地址了。不是改变原来的地址值的字符串内容。\u0000这是一个char类型的。用""号就转成了字符串类型。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马