CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

關於java中按值傳遞的疑問

楼主ousys()2006-06-04 17:14:11 在 Java / J2SE / 基础类 提问

看到該社區的一篇文章,java   其實是按值傳遞的,   就很疑惑,這種情況是怎麽解釋的呢?  
  String   a="a";  
  String   b=a  
  b="b"  
  此時a="b",   如果按值傳遞,它不是應該修改的是他的copy   嗎,爲什麽會這樣呢?  
   
  可是按引用傳遞,  
  public   void   fn1(String   a){    
      a="aaaa"    
    }    
    public   static   void   main(String   []args){    
      String   b="bbb";    
      fun1(b);    
      System.out.println(b);    
    }    
  打印的結果爲什麽是bbb   呢?  
  很疑惑,向高手請教,  
  還有,   能夠有什麽辦法得到返回類行爲boolean   的方法裏的integer   嗎? 问题点数:10、回复次数:10Top

1 楼UnAgain()回复于 2006-06-04 18:15:38 得分 10

传值和传引用一般指的是变量在方法之间的传递方式。  
   
   
  1)你的第一个问题不是传值,而是赋值。另外,a仍然是"a",不是"b"。你自己测试一下。  
   
  我要吃饭了,过会儿再给你详细解释解释Top

2 楼ousys()回复于 2006-06-04 18:42:28 得分 0

thank   u   ,   wait   ur   answer.Top

3 楼UnAgain()回复于 2006-06-04 19:57:24 得分 0

等会儿。  
   
  1)你的第一个问题不是传值,而是赋值。另外,a仍然是"a",不是"b"。你自己测试一下。  
   
  这个问题你测试了没有?Top

4 楼UnAgain()回复于 2006-06-04 19:59:09 得分 0

今晚有事,你明天看吧,不好意思。Top

5 楼ousys()回复于 2006-06-04 19:59:11 得分 0

這個測試了,可是在我的記憶裏好像有一個相似的是通過REFERENCE的,  
  謝謝,剩下的繼續說Top

6 楼UnAgain()回复于 2006-06-05 09:51:46 得分 0

正在考虑你的问题。我发现一个道理,越是基本问题越不能马虎。  
   
  我正在看langspec3.0,有兴趣你也可以看看。  
   
  待会儿给你答复。Top

7 楼uesugitatsuya(风吹那年流水)回复于 2006-06-05 10:35:20 得分 0

第二个问题,传递的是string对象一个引用的副本,而不是引用.你在函数里面更改了引用的副本,但是并不是对引用指向的对象的更改,如果你用a.append("aaa")就会发现值不一样了.Top

8 楼UnAgain()回复于 2006-06-05 13:47:20 得分 0

好了,写完了。  
   
  我另外建了一个帖子  
  http://community.csdn.net/Expert/TopicView1.asp?id=4801113  
   
  大家一起讨论讨论这个问题。Top

9 楼UnAgain()回复于 2006-06-05 22:09:26 得分 0

借题发挥,写了一大堆,不知道你看过来没有,不知道我写的是不是清楚?Top

10 楼UnAgain()回复于 2006-06-06 17:09:02 得分 0

先给你解释这句话的执行过程  
          String   a="a";  
  首先,创建一个String对象,值为“a”。然后,再把对象“a”的引用赋值给变量a。  
  这就是我文章中说的,变量保持对象的引用,但不是对象。  
   
  看代码:  
  String   a="a";  
  String   b=a;     //   把在变量a中保存的对象“a”的引用,赋值给b,即a把自己保存的对“a”的  
                            //   引用复制给b。记住,引用本身是数值,可能是对象的入口地址。  
  b="b"                 //   又创建一个新的对象“b”,然后把对象“b”赋值给变量b  
  从上面你可以看到,只是改变了变量b的值,而对变量a没有任何影响,所以a仍然等于“a”  
   
   
  可是按引用傳遞,  
  public   void   fn1(String   a){    
      a="aaaa"    
    }    
    public   static   void   main(String   []args){    
      String   b="bbb";    
      fun1(b);    
      System.out.println(b);    
    }    
   
  调用fun1(b),变量b把自己保存的对象“b”的引用赋值给fun1的参数,即变量a。道理和上面一样。所以,a的改变,不会影响b的改变。  
   
  你再看我文章中的这个例子。  
  class   Word   {  
          String   word;  
          public   Word(String   word){  
                  this.word   =   word;  
          }  
          public   void   print(){  
                  System.out.println(word);  
          }  
          public   void   setWord(String   word){  
                  this.word   =   word;  
          }  
  }  
   
  Word   o1,   o2;  
   
  o1   =   new   Word("Every   Day");  
  o2   =   o1;  
  o2.setWord("Every   Night!");  
   
  o1.print();  
   
  这时的结果是"Every   Night!"。  
   
  那么,这是改变了o1吗?从严格意义上讲,不是。因为o1只是保存对象的引用,执行之后,o1还是持有该对象的引用。所以,o1没变,变的是o1所引用的对象。  
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:ousys
  • UnAgain

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo