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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sam9204 中级黑马   /  2014-6-8 23:58  /  1212 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sam9204 于 2014-6-9 22:58 编辑

public class Example{
    String str=new String("good");
    char[] ch = {'a','b','c'};
    public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);      
}   
public void change(String str,char ch[]){
          str="test ok";
          ch[0]='g';
     }
}
输出结果是:good and gbc对于这个结果有点疑惑,知道是传值传引用的问题,但还是不了解具体细节,请各位高手指点指点,谢谢

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 shisishishisi 于 2014-6-9 00:31 编辑

要时时刻刻有面向对象编程的思想,给str赋值时要确定是给哪个对象的str属性赋值,另外楼主可以试试把change方法中的第一个参数改为String s
  1. public void change(String str,char ch[]){
  2.           this.str="test ok";
  3.           ch[0]='g';
  4.      }
复制代码

回复 使用道具 举报
画了张图,画的有点烂,不知道你能否看得懂

QQ截图20140609002008.jpg (71.88 KB, 下载次数: 52)

QQ截图20140609002008.jpg

点评

ex在内存中指向没有变化,所以我就没有在栈内存中画出来,点评我的兄弟,new的时候栈内存中没有地址,栈内存中的变量是声明的时候出现的  发表于 2014-6-9 12:44
我怎么觉得画得不太对呢?栈中指向ex的地址怎么不存在,new 不是在栈中也有一地址的吗?另外,什么时候放在常量池我自己本身不太清楚。。  发表于 2014-6-9 11:37

评分

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

查看全部评分

回复 使用道具 举报
shisishishisi 发表于 2014-6-9 00:16
要时时刻刻有面向对象编程的思想,给str赋值时要确定是给哪个对象的str属性赋值,另外楼主可以试试把change ...

原来它只是改变了局部变量对应的值,换成this.str="test ok";的话就是改变类成员变量值了
回复 使用道具 举报
月光海 发表于 2014-6-9 00:21
画了张图,画的有点烂,不知道你能否看得懂

图能看懂,但还是理解不太清楚,不过还是谢谢你
回复 使用道具 举报
sam9204 发表于 2014-6-9 22:37
原来它只是改变了局部变量对应的值,换成this.str="test ok";的话就是改变类成员变量值了 ...

嗯,是的,就相当于当函数的局部变量name和类的成员变量同名的情况
回复 使用道具 举报
你这里输出的应该是good and gbc首先java里确实是传值,不是传引用。public void change(String str,char ch[]){ str="test ok"; ch[0]='g'; } 你这里的str="test ok"只是修改的局部变量str,不是类的成员变量。类的成员变量并没有被修改,如果你把参数里的str换成str1你在试试看,输出的结果就是test ok 了。。关于这个你可以做个小测试,在方法里声明一个变量,这个变量的名字和类的成员变量同名,然后你赋值。会发现类成员变量不会被修改的。为什么char[] ch里的东西会被修改呢?因为char是原始类型,也就是本身不是对象,是直接放在栈里的。也就是说传递的就是本身的地址。所以结果里是被修改了的。。你可以把char换成int来测试,结果还是会被修改,因为int也是原始类型还有个测试,你可以把参数里的ch变量换成ch1结果仍然不会变,还是会被修改。。这里注意局部变量会覆盖类成员变量,还有就是原始类型的特殊性。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马