黑马程序员技术交流社区

标题: 求助,一段有关打印字符串的习题 [打印本页]

作者: 梁海君    时间: 2013-5-5 18:03
标题: 求助,一段有关打印字符串的习题
本帖最后由 梁海君 于 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 ?求懂的朋友解释下
这段代码应用到的知识是哪一些,好让我有一个方向去参考,方便吃透它
在此,先感谢~~
作者: 曾大鹏    时间: 2013-5-5 18:22
String是引用类型,具有不可变型 就是每次操作 就会new一个对象。
而在你的change方法里 str是一个新的对象。。跟原新的str没关系
然后char ch[] 直接在作用在原新的ch  所以ch[0]='g' 是有效的

最后输出 good and gbc

应用的是参数传递有关知识。。个人见解 {:soso_e113:}
作者: hou604720966    时间: 2013-5-5 18:35
你看看附件吧

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

}0JZQL7D[]K6UO3]6}$2IGS.jpg

作者: Jacky_Chen1990    时间: 2013-5-5 18:38
曾大鹏 发表于 2013-5-5 18:22
String是引用类型,具有不可变型 就是每次操作 就会new一个对象。
而在你的change方法里 str是一个新的对象 ...

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

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

捕获.JPG

作者: 梁海君    时间: 2013-5-5 20:07
曾大鹏 发表于 2013-5-5 18:22
String是引用类型,具有不可变型 就是每次操作 就会new一个对象。
而在你的change方法里 str是一个新的对象 ...

:handshake灰常感谢~
作者: 梁海君    时间: 2013-5-5 20:09
hou604720966 发表于 2013-5-5 18:35
你看看附件吧

谢谢指导~
作者: 梁海君    时间: 2013-5-5 20:09
黑马伍哲沂 发表于 2013-5-5 18:39
还能说什么呢。  上链接http://bbs.itheima.com/thread-48732-1-1.html。

很好很强大,感谢大侠~~
作者: 白磊    时间: 2013-5-5 20:10
  把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 20:10
刘学明    发表于 2013-5-5 18:52
参数传递问题:
Stirng类型传递 (相当于值传递) str是每操作一次就会产生一个新的对象  不会和原str有关 ...

3Q~3Q~:handshake
作者: 曹睿翔    时间: 2013-5-5 22:39
如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问
作者: 梁海君    时间: 2013-5-6 12:49
曹睿翔 发表于 2013-5-5 22:39
如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问

老大,不能给个技术分么?第一次发帖呢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2