免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: perryhg
打印 上一主题 下一主题

java经典问题:传值还是传引用 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-20 13:26 |只看该作者
谢谢k
这两天学到了好多原来不懂的东西

可是今天也郁闷了,东西永远也学不完,不知道学这些有什么意义......自己要做什么......
抑郁。。。。。

[ 本帖最后由 只爱一点点 于 2006-3-20 13:28 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2006-03-20 16:53 |只看该作者
对于非引用类型是传值,对于引用类型的是传对象(尽管存的是堆栈里的值),这么理解能容易点?

论坛徽章:
0
13 [报告]
发表于 2006-03-23 10:21 |只看该作者
楼上有误解的嫌疑
原帖由 smlweb 于 2006-3-20 16:53 发表
对于非引用类型是传值,对于引用类型的是传对象(尽管存的是堆栈里的值),这么理解能容易点?

对于引用类型的传参也是传值的,传的是引用类型的值,其实就是对象的地址。

1.java参数传递值的。
2.java所有对像变量都是对像的引用。
这两句话很有道理

论坛徽章:
0
14 [报告]
发表于 2006-03-23 13:41 |只看该作者
总之一句话,JAVA方法中凡是对象参数,传递的都是引用。
方法中对引用的使用都会波及被引用的对象。
在使用者来说,最好还是这样理解的好,能理解到这个层面也就够了。

有人说,JAVA方法中参数传递的本质依然是值传递,这个说话也不无道理的,
因为,传递参数时,本质上传递的是指针,指针当然也有值的,只是JAVA创始者
很忌讳指针这种说话,并且他们也作到了让开发者不必关心指针的问题了。

所以过多的争论,没有太大的价值。因为我觉得大家已经明白了一切。

论坛徽章:
0
15 [报告]
发表于 2006-03-23 14:01 |只看该作者
原帖由 xxjoyjn 于 2006-3-23 13:41 发表
总之一句话,JAVA方法中凡是对象参数,传递的都是引用。
方法中对引用的使用都会波及被引用的对象。
在使用者来说,最好还是这样理解的好,能理解到这个层面也就够了。

有人说,JAVA方法中参数传递的本质依然 ...




  1. public class A{
  2.    public void change(A a){
  3.         a = new A();
  4.         System.out.println(a);
  5.    }
  6.    public static void main(String[] args){
  7.         A a = new A();
  8.         System.out.println(a);
  9.         a.change(a) ;      
  10.         System.out.println(a);
  11.    }
  12. }
复制代码


刚才少写一句话。。。

[ 本帖最后由 艾斯尼勒 于 2006-3-23 14:06 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2006-03-23 14:12 |只看该作者
两次println(a)结果应该不一样才对

论坛徽章:
0
17 [报告]
发表于 2006-03-23 14:32 |只看该作者
原帖由 xxjoyjn 于 2006-3-23 14:12 发表
两次println(a)结果应该不一样才对


我一开始少写了一行发上来了

现在是3行输出
main中调用方法前第一次,调用方法里面第2此,调用完第3次

挺能证明都是传值的

论坛徽章:
0
18 [报告]
发表于 2006-03-23 14:55 |只看该作者
其实,应该是你说的这种结果,你打印出来的是对象的地址,也就是指针的值,从这个角度来看当然是传值的,

论坛徽章:
0
19 [报告]
发表于 2006-03-23 15:00 |只看该作者
其实,传的都是值,关键是看你是从哪个角度来看问题,对于JAVA面向对象编程的开发者来说,除了
基本类型以外,可以认为方法的对象参数传递的都是应用,方法只是在应用这个对象,并没有拷贝这样一个对象,所以从这个角度来说,传递的又不是值!

论坛徽章:
0
20 [报告]
发表于 2006-03-23 15:25 |只看该作者
我没有做试验,不过,我分析17楼的朋友的这个例子,输出的第一行和第三行的结果应该是一样的,
第二行就不同了,是因为:

虽然我在上面说过,传递的对象是不被复制的,这个是肯定的,但是传递的本质是指针值是要复制的。
它跟int char型的变量在这点上是没有区别的,不过要明白的是println(a)打印的是对象的地址,也就是指针的值,而不是对象本身。在change方法里的a的值是可以通过a=new A()来改变其值的,这个时候由于上新建对象,当然这个对象的地址就不一样了,也就是说在这个方法的a的值就发生了改变。但在这个方法外,a的值是没有发生任何改变的,所以第一行和第三行的打印结果是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP