黑马程序员技术交流社区

标题: java的参数是值传递还是引用传递 [打印本页]

作者: 程金    时间: 2012-9-18 17:42
标题: java的参数是值传递还是引用传递
本帖最后由 程金 于 2012-9-19 14:48 编辑

以前没在意,刚才我看书上说是值传递,我试验了下,对于基本类型的传递,传递给一个方法,在方法中改变这个值,不改变原来值,但是对象的话,把对象传给一个方法,在方法中改变对象的值,原来的值也会改变,这不是引用传递吗?书上的错了?
作者: 皮卫凯    时间: 2012-9-18 17:56
本帖最后由 皮卫凯 于 2012-9-18 18:10 编辑

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

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



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


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

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

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


作者: 程振    时间: 2012-9-18 18:05

传递引用类型的对象

传递基本数据类型时
作者: 赵宇    时间: 2012-9-18 19:11
java中没有值传递,全部是引用传递,请各位同学来验证。
作者: 赵宇    时间: 2012-9-18 21:16
更正一下。在java中无论是原生数据类型,还是引用类型,统一都是传值。
作者: zhaosenyang    时间: 2012-9-18 23:00
本帖最后由 赵森羊 于 2012-9-18 23:04 编辑


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

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

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

PS:我估计外国就没想这么复杂,这个问题画图能很好的理解,为什么迷惑呢?就是因为中国汉字的博大精深。值,可以是数据本身的值,也可以是地址值。也许在外国,应该有不同的英文单词来阐述这两个值。一个值,一个引用。这个没必要太纠结于概念,知道内存中的变化就可以了。
作者: 程金    时间: 2012-9-19 14:48
问题已解决
作者: 班志国    时间: 2012-9-19 16:04
我感觉是引用传递




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2