CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2EE / EJB / JMS

java方法中参数是对象时,是值传还是引用传,这个程序让我很难明白

楼主xylll(逍遥鸟)2005-06-03 09:08:30 在 Java / J2EE / EJB / JMS 提问

class   Test{  
  void   test(String   a)  
  {  
  a+="test";  
  }  
  void   test1(Collection   a){  
  a.add("test");  
  }  
  public   static   void   main(String[]   args){  
  String   x="A";  
  Collection   y=new   ArrayList();  
  test(x);  
  test1(y);  
  System.out.println(x);  
  System.out.println(y);  
  }  
  运行结果是A  
  test  
  也就是说参数是String型时不管你在方法怎么操作,最后原来的值不变,而如果是其它类型,如ArrayList就变化了,这是为什么?  
   
  } 问题点数:20、回复次数:16Top

1 楼wearetheone(beehead)回复于 2005-06-03 09:18:00 得分 0

同问,帮顶  
  Top

2 楼wearetheone(beehead)回复于 2005-06-03 09:21:01 得分 0

首先说说自己的意见,类类型是使用引用的,这个变化就很肯定了,至于String原来的值不变,我是知道的,不过String也是一个类类型吧(好像是比较特殊的),具体希望高手分析一下Top

3 楼jihanzhong(逍遥)回复于 2005-06-03 09:24:52 得分 0

String是相当特殊的类!  
  你可以用StringBuffer看看。  
   
  记住一句话:String不停的创建对象,StringBuffer不停的改变对象Top

4 楼Maple99(Maple)回复于 2005-06-03 09:27:06 得分 0

JAV方法中参数,如果传递的是对象的话,其传递的是  
  对象的句柄,也就是安全类型的指针,当然你对指针操作也就是间接的对对象操作,但是对传入的参数,也就是句柄而言仍然是值传递,个人理解,有错的地方还请指出。另STRING类型是一个中特殊类型  
  其==和EQUAL的意思大致相同Top

5 楼wearetheone(beehead)回复于 2005-06-03 09:30:24 得分 10

关于string是值类型还是引用类型   当然了,string本质上肯定是引用类型,但是这个特殊的类却表现出值类型的特点:  
  判断相等性时,是按照内容来判断的,而不是地址  
  它肯定是一个引用类型没错,两个方面来看:  
  1.   class   string继承自object,而不是System.ValueType(Int32这样的则是继承于System.ValueType)  
  2.   string本质上是个char[],而Array是引用类型,并且初始化时也是在托管堆分配内存的  
  string类型的另外一个特殊性在于它是“不会变”的,每次操作string,都相当于新建了一个string对象,所以对于string来讲,void   Test(String   s)和void   Test(ref   String   s)永远都是不一样的。在这里string再次表现出了值类型的特点,我们以为这是传值   -   实际上传送的还是地址,但是在操作的时候string被再次初始化,外部根本不能得到这个变化。  
  还有,一般String被称为是简单类型,简单类型为传值,其他类型为传引用,这样就好解析了Top

6 楼dreamno(我命不由天)回复于 2005-06-03 09:33:54 得分 0

当你经过+运算后。a指向的已经不是“A“这块内存了。Top

7 楼ses127127(ses)回复于 2005-06-03 09:41:51 得分 0

Java   编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。  
  Top

8 楼ghostsG(GCool)回复于 2005-06-03 09:46:07 得分 0

String是不停的构建新的对象。Top

9 楼imliyf(dd)回复于 2005-06-03 10:13:46 得分 0

同意,jihanzhong(逍遥),顶Top

10 楼jeaking(空空)回复于 2005-06-03 10:27:50 得分 0

String   s   =   "aaa";  
  s   +=   "bbb";  
  //////////////////////  
  这两行代码涉及到3个对象,一个是"aaa",   一个是"bbb",还有一个是这两个对象相加得到的结果。  
  s   +="bbb"的意思并不是说把"bbb"加到原来对象的后面,而是两个对象相加生成一个新的对象。s已经指向新的对象了。Top

11 楼gks_cn(981530)回复于 2005-06-09 19:54:29 得分 0

你看看java模式的深复制和浅复制,上面讲得多。Top

12 楼zzack(zack)回复于 2005-06-10 09:38:00 得分 0

java中所有的传递方法都是传值,不过由于对于对象的传递都是传递的对象的地址,所以也变成了传址Top

13 楼Runningboy007(菜鸟)回复于 2005-06-13 16:19:16 得分 0

学习中Top

14 楼totyulvxl(sun)回复于 2005-06-13 17:20:26 得分 0

upTop

15 楼pope_tju(飞刀小虫)回复于 2005-06-13 19:25:08 得分 0

对于基本类型pass   by   value     传递某个对象时是pass   by   reference  
   
  而String是一个唯读类进行a+="test"是创建了一个新的对象指向a+test而a依然还是原来的对象。  
   
  ps:楼主可以参看Thinking   in   java中的附录ATop

16 楼wangsheng1028(java菜)回复于 2005-06-13 20:09:41 得分 10

首先说说自己的意见,类类型是使用引用的,这个变化就很肯定了。  
  String为不可变对象,看看jdk对于string的描述就知道了  
  Strings   are   constant;   their   values   cannot   be   changed   after   they   are   created.  
  地址不变内容肯定不变。Top

相关问题

  • 请教!!java中的参数传值还是传引用?
  • 关于java参数是传递引用的不解
  • java函数传参数有“传值”与“传引用(指针)”之分吗?
  • java中如何使参数传递按传"引用"方式进行?
  • java中如果对象是函数参数 到底是传值还是引用???
  • *** 有人在家吗? 参数引用问题, LPVOID参数 传递引用
  • 大家帮忙看一下关于JAVA是参数传递是传值还是传引用的问题???
  • 【请教】关于Java函数传递参数的类型(传值还是传引用)
  • 请问如何用java实现类似于c中的传引用参数的函数
  • C#是否支持参数的引用传递

关键词

  • 内容
  • 对象
  • 引用
  • 类型
  • 参数
  • 传递
  • 方法
  • 值
  • bbb
  • 指向

得分解答快速导航

  • 帖主:xylll
  • wearetheone
  • wangsheng1028

相关链接

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

广告也精彩

反馈

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