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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁海君 中级黑马   /  2013-5-5 18:03  /  1641 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梁海君 于 2013-5-6 00:51 编辑

我菜鸟一个,刚刚看了毕老师前10天的视频,为了加深理解
便找了阶段习题来做
习题似乎在哪里见过了,但由于不是自己做过,没什么印象了
  1. public class Example {
  2.         String str = new String("good");
  3.         char[] ch = {'a','b','c'};
  4.         
  5.         public static void main(String args[]){
  6.                 Example ex = new Example();
  7.                 ex.change(ex.str,ex.ch);
  8.                
  9.                 System.out.print(ex.str + " and ");
  10.                 System.out.print(ex.ch);
  11.         }
  12.         public void change(String str,char ch[]){
  13.                 str = "test ok";
  14.                 ch[0] = 'g';
  15.         }
  16. }
复制代码
代码打印的是:good and gbc
我的问题是,打印的为什么不是 test ok and gbc ?求懂的朋友解释下
这段代码应用到的知识是哪一些,好让我有一个方向去参考,方便吃透它
在此,先感谢~~

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

13 个回复

倒序浏览
String是引用类型,具有不可变型 就是每次操作 就会new一个对象。
而在你的change方法里 str是一个新的对象。。跟原新的str没关系
然后char ch[] 直接在作用在原新的ch  所以ch[0]='g' 是有效的

最后输出 good and gbc

应用的是参数传递有关知识。。个人见解 {:soso_e113:}
回复 使用道具 举报
你看看附件吧

}0JZQL7D[]K6UO3]6}$2IGS.jpg (47.06 KB, 下载次数: 1)

}0JZQL7D[]K6UO3]6}$2IGS.jpg
回复 使用道具 举报
曾大鹏 发表于 2013-5-5 18:22
String是引用类型,具有不可变型 就是每次操作 就会new一个对象。
而在你的change方法里 str是一个新的对象 ...

恩 楼上说的对。我就不说了。。{:soso_e113:}
回复 使用道具 举报
还能说什么呢。  上链接http://bbs.itheima.com/thread-48732-1-1.html
回复 使用道具 举报
参数传递问题:
Stirng类型传递 (相当于值传递) str是每操作一次就会产生一个新的对象  不会和原str有关系 。
数组类型传递   (地址传递)  当在方法中给ch[0]赋值以后, 也就是说原数组ch[0]的引用地址发生了变化,即变成了g , ch[1]  ch[2]没有发生变化。
回复 使用道具 举报
LS们的观点,已经给出了答案,不过我有一点疑惑,既然是调用本类中的方法来改变类变量为什么需要传递参数呢?(见下图)
如果这样修正,也不需要添加this来将str指向类变量。(个人观点,O(∩_∩)O~)

捕获.JPG (47.54 KB, 下载次数: 0)

捕获.JPG
回复 使用道具 举报
曾大鹏 发表于 2013-5-5 18:22
String是引用类型,具有不可变型 就是每次操作 就会new一个对象。
而在你的change方法里 str是一个新的对象 ...

:handshake灰常感谢~
回复 使用道具 举报
hou604720966 发表于 2013-5-5 18:35
你看看附件吧

谢谢指导~
回复 使用道具 举报
黑马伍哲沂 发表于 2013-5-5 18:39
还能说什么呢。  上链接http://bbs.itheima.com/thread-48732-1-1.html。

很好很强大,感谢大侠~~
回复 使用道具 举报
  把change()方法写成这样就可以得到你想要的结果了。因为只有这样写  this.str = "test ok";才能改变对象的str这个属性;而这样写的话str = "test ok";其实是在操作另外一个str,根本不会影响到对象中的str属性。但是ch[0] = 'g';这个可以作用在对象的ch属性上。
  public void change(String str,char ch[]){
                this.str = "test ok";
                ch[0] = 'g';
        }
回复 使用道具 举报
刘学明    发表于 2013-5-5 18:52
参数传递问题:
Stirng类型传递 (相当于值传递) str是每操作一次就会产生一个新的对象  不会和原str有关 ...

3Q~3Q~:handshake
回复 使用道具 举报
如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问
回复 使用道具 举报
曹睿翔 发表于 2013-5-5 22:39
如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问

老大,不能给个技术分么?第一次发帖呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马