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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程金 中级黑马   /  2012-9-18 17:42  /  2347 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程金 于 2012-9-19 14:48 编辑

以前没在意,刚才我看书上说是值传递,我试验了下,对于基本类型的传递,传递给一个方法,在方法中改变这个值,不改变原来值,但是对象的话,把对象传给一个方法,在方法中改变对象的值,原来的值也会改变,这不是引用传递吗?书上的错了?

7 个回复

倒序浏览
本帖最后由 皮卫凯 于 2012-9-18 18:10 编辑

附上实例: 实例.zip (847 Bytes, 下载次数: 283)

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。参数是原始类型int,long,float,byte,char,double、boolean、short等等。
               对象的传递其实也是引用的传递。  
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。



   当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么也是值传递。   
   当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。


     Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。

    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.

    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。

回复 使用道具 举报

传递引用类型的对象

传递基本数据类型时

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
java中没有值传递,全部是引用传递,请各位同学来验证。
回复 使用道具 举报
更正一下。在java中无论是原生数据类型,还是引用类型,统一都是传值。
回复 使用道具 举报
本帖最后由 赵森羊 于 2012-9-18 23:04 编辑


java中可以说是 只有值传递。
实参如果是基本数据类型或者是常量字符串,String str="abc",传递给形参,就相当于将实参的值赋值给形参,调用方法,如果改变了这个值,那也只是形参的值改变,方法执行结束,在内存中释放,实参值不变。
实参如果是引用数据类型,那传递给形参的同样是值,同样也是个赋值动作。什么值?地址值。因为引用数据类型变量的值本身就是一个内存地址值,是一个堆内存中一个new出来的东西的引用。在方法中,形参改变有两种情况,一种改变是仍然对这个地址引用操作,也就是说对这个引用指向的对象进行操作,方法执行过程中,形参的值,就是这个地址引用没变,那么,操作改变的就是所指向的对象。这就叫形参改变实参。
还有另一种情况,当形参的值改变了,比如又=new xxx,这个动作,形参的值改变了,那么方法的操作都是针对的这个新new出来的东西,而不对实参值指向的对象有所影响,所以此时,形参又不该变实参。

总之:
实参是基本数据类型和字符串,形参的值无论改不改变,方法的执行都不影响实参。
实参是引用数据类型,形参的值变化,方法的执行不影响实参,不变化,方法的执行影响实参。

不管实参是什么类型,都可以称为值传递,都是将实参的值赋值给形参 前者是数据的值,后者是所指向对象的地址值,即对象的引用

PS:我估计外国就没想这么复杂,这个问题画图能很好的理解,为什么迷惑呢?就是因为中国汉字的博大精深。值,可以是数据本身的值,也可以是地址值。也许在外国,应该有不同的英文单词来阐述这两个值。一个值,一个引用。这个没必要太纠结于概念,知道内存中的变化就可以了。

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

回复 使用道具 举报
程金 中级黑马 2012-9-19 14:48:14
7#
问题已解决
回复 使用道具 举报
我感觉是引用传递
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马