黑马程序员技术交流社区

标题: 关于值传递引用传递的一些问题 [打印本页]

作者: 练习题    时间: 2014-8-6 11:02
标题: 关于值传递引用传递的一些问题
我看了一些文章,还是有点摸不着头脑说Java没有引用传递,说是什么用值传递拷贝了引用的副本,什么是副本.谁能帮我画个图解释一下吗?
作者: 怀念黑海岸    时间: 2014-8-6 12:18
      不需要画图,很容易理解的。
      你记好这句话:java中不管是值传递还是引用传递,其实都是传递的是具体的值。
      如何理解:当你传的是基本数据类型的话那么肯定是具体的值了,当你传递的是引用数据类型的话,像对象,那么你传递进去的并不是对象实体,而是这个对象的地址,地址也是具体的值,所以才有传递其实就是传递具体的值的说法。
       但是两者还是有区别的,你传递基本数据类型时,你传进去的其实是这个基本数据类型的一个拷贝,你在传值进去的方法中对这个数据的操作其实是在操作这个拷贝,而真正的实体,他是不会随你的操作而发生改变的,也就是当你这个方法结束后,变化的是拷贝,数据本身不发生变化。String不是基本数据类型,但是他却和基本数据类型一样传递的是拷贝。这是一个特例,记住了。
      而你传递对象进去时,因为传递的是对象地址,那么方法内涉及到对对象的操作时,所以操作最终都是指向这个对象的,那么你在方法中对对象做出的任何修改,都会导致对象实体发生改变,一个对象实体是可以对应多个对象引用变量的哦。任何引用变量做出的动作都会导致对象实体跟着做出响应。
     
作者: MeloX    时间: 2014-8-6 12:24
有点数据总线,控制总线和地址总线的感觉
作者: liubea    时间: 2014-8-6 13:44
不管是原生类型还是对象的引用都是值传递,只不过引用传递的是地址值。
作者: 练习题    时间: 2014-8-6 18:18
怀念黑海岸 发表于 2014-8-6 12:18
不需要画图,很容易理解的。
      你记好这句话:java中不管是值传递还是引用传递,其实都是传递的 ...

这些我都理解,谢谢.我只是不太懂各个语言的说法,其他语言传地址值叫做引用传递,而java里头就想你说的类,是引用类型也是传地址值,但是说java里头只有值传递没有引用传递.可能就是一种说法吧
作者: 练习题    时间: 2014-8-6 18:19
liubea 发表于 2014-8-6 13:44
不管是原生类型还是对象的引用都是值传递,只不过引用传递的是地址值。

嗯嗯 谢谢,
作者: fantacyleo    时间: 2014-8-6 18:25
练习题 发表于 2014-8-6 18:18
这些我都理解,谢谢.我只是不太懂各个语言的说法,其他语言传地址值叫做引用传递,而java里头就想你说的类, ...

我也觉得引用传递的概念是多余的,不过其他语言想多定义一个概念,这无妨。但从功能上来说,Java里还真是没有其他语言里定义的那种”引用传递“。比如一个数组int[] a,C#里用ref就可以在所调用的方法里让a指向其他数组,Java里就做不到,你只能改a中的元素,但无法让a改变指向;只能让被调用方法返回一个新数组,然后用a接收,即a = foo(a);这种形式
作者: 练习题    时间: 2014-8-6 18:31
fantacyleo 发表于 2014-8-6 18:25
我也觉得引用传递的概念是多余的,不过其他语言想多定义一个概念,这无妨。但从功能上来说,Java里还真是 ...

嗯,其实我也明白了一些道理,真正两个对象做交换也是一样的,swap里头对象的交换,根本影响不到main函数的实参的两个对象.突然也明白了,其实所谓引用传递就是传递地址,跟传递值是一样.就叫值传递吧.谢谢你阿!!




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