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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林其荣 中级黑马   /  2013-1-16 19:21  /  1625 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-17 16:15 编辑
  1. String String1[] = new String[]{"one"};
  2. String String2[] = new String[1];
  3. String2 = String1;   
  4. String2[0] = "two";
  5. for(int x=0;x<String1.length;x++){
  6. System.out.println(String1[x]);
  7. }
复制代码
//打印出来的结果是 three two 我修改第二个数组的0角标元素后第一个数组的0角标元素的值也跟着变化了
  1. String Str = new String("one");
  2. String str1 = new String();
  3. str1 = Str;
  4. str1 = "two";
  5. System.out.println(Str);
  6.         }
  7. }
复制代码
//而打印这段代码却打印出one
//我想问的是同样是引用数据类型 ,那为什么String1[0] 的值就跟着变了,而Str的值却没变呢?

评分

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

查看全部评分

4 个回复

倒序浏览
  1.                 String String1[] = new String[] { "one" };
  2.                 String String2[] = new String[1];
  3.                 //String2和String1同时指向一个堆地址,这个堆地址的值为“one”
  4.                 String2 = String1;
  5.                 //修改了堆中的数据
  6.                 String2[0] = "two";
  7.                 for (int x = 0; x < String1.length; x++) {
  8.                         System.out.println(String1[x]);
  9.                 }

  10.                 String Str = new String("one");
  11.                 //在栈中声明一个变量str1,它指向堆中的一个String对象
  12.                 String str1 = new String();
  13.                 //str1指向的字符串对象的值为“one”
  14.                 str1 = Str;
  15.                 //str1变量指向一个新的对象,对象值为“two”
  16.                 str1 = "two";
  17.                 System.out.println(Str);
复制代码
总结一下,String类型是不可变的,他是一个对象,对String类型赋值是新new出一个对象,再让它指向这个新的堆地址

评分

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

查看全部评分

回复 使用道具 举报
你的代码写的好凌乱,引用数据类型传递的是引用,在对内存中的相应地址,而访问是就是凭借这这个地址从堆内存中找,还有数组是通过下角标来访问数据的,要注意下角标的变化。
回复 使用道具 举报
本帖最后由 黄金龙 于 2013-1-17 00:12 编辑
  1. class Demo12
  2. {
  3. public static void main(String[] args)
  4. {
  5. String String1[] = new String[]{"one"};

  6. String String2[] = new String[1];

  7. String2 = String1;   ////2个数组都指向同一个引用 修改String2[0]的值就等于修改了String2[0]的值所以会打印 two

  8. String2[0] = "two";

  9. for(int x=0;x<String1.length;x++)
  10.         System.out.println(String1[x]);

  11. show();//你的第二个代码我把他封装在这里了
  12. }
  13. //======================//
  14. // ----------代码分割线-----
  15. //======================//
  16. static void show()
  17. {

  18. String str = new String("one");

  19. String str1 = new String();

  20. str1 = str;////这里的话str1 会指向一个新的引用而不是指向str这里的

  21. str1 = "two";

  22. System.out.println(str);//所以打印的是 one
  23. }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 我感觉一楼解释的已经很好 鼓励一下.

查看全部评分

回复 使用道具 举报
第一个是数值元素长度的循环取值
第二个是new对象的赋值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马