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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请看程序就OK了:
  1. /*
  2. 有点小疑惑:不是说String一旦被定义初始化就不能被改变吗?
  3. 我这个小程序就有点矛盾哦,求详细介绍……
  4. */

  5. class TestString
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 String s1="hello good luck to you!";

  10.                 String s2=s1.replace('e','w');
  11.                
  12.                 System.out.println(s2);
  13.                 System.out.println(s1);
  14.                 /*
  15.                 打印结果是:
  16.                 hwllo good luck to you!
  17.                 hello good luck to you!
  18.                 */

  19.                 /*
  20.                 String s1="hello good luck to you!";

  21.                 s1=s1.replace('e','w');
  22.                
  23.                 System.out.println(s1);

  24.                 打印结果是:hwllo good luck to you!
  25.                 那原来的s1跑到哪里去呢?
  26.                 */
  27.         }
  28. }
复制代码

4 个回复

倒序浏览
这两者有什么具体的不同,请说得详细点,第二个代码块被替换了,但是这样的话,原值被改变了,是不是说明String对象中字符串的初始化可以被改变?
回复 使用道具 举报
所谓可变不可变,是针对“对象”而不是“对象的引用”而言的。s1和s2变量都是存储在栈内存中的对象的引用,,而不是存储在堆内存中的对象本身。s1=s1.replace('e','w');只是让s1指向了与原先不同的对象,并没有改变原先对象的值。
  1. String s1 = "hello";
  2. String s2 = s1;
  3. s1=s1.replace('e', 'w');
  4. System.out.println(s2);
复制代码

上述代码运行结果是输出hello,证明"hello"对象并没有被改变。如果你认为"hello"对象被改变了,那么应该输出hwllo
回复 使用道具 举报 1 0
支持一个!!
回复 使用道具 举报
哦,你这样一说,终于明白了,谢谢,我当时怎么就没有从堆内存和栈内存中去具体分析呢?哎,现在看起来这个问题十分幼稚了,呵呵!感谢感谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马