首页 > 值传递和引用传递

值传递和引用传递

为什么在java学习中要引入这个值传递和引用传递?也就是说这个值传递和引用传递的作用是什么?


值传递应该是拷贝了一个副本,引用传递是将变量直接指向内存中的地址,这个地址中的值变了的话,所有指向它的变量值都变了。比如变量a的值是123456,在内存中的地址是0xxxx,将a引用传值给b,那么b也指向0xxxx,即使修改b的值,也就是修改了该地址中的值,a的值也会改变。但是直接赋值的话他们在内存中的地址就不同了,互不相干。


许多面向对象编程语言里,都会存在值传递或者引用传递概念。

值传递一般是基本类型的变量,引用传递一般是对象等复杂类型的变量。这两种变量的存储位置是不一样的。基类型存储于栈内存中,复杂类型存储于堆内存中。

出于性能的考虑,如果将一个基本类型的变量赋值给另外一个变量,只是单纯的内存复制。如果是复杂变量,会牵扯到许多东西,复制的效率比较低。所以只能引用传递,也就是地址传递。

说个比喻:如果你需要一块砖,我可以马上拿给你;如果说你需要一座山,我只能告诉你山在那边。


知足吧少年。到了C和C++里面就是让你操纵指针了。
我的意思是你可以参考一下C系语言里的指针。


其实都是值传递, 所谓"引用传递"是说传递的值是一个引用.

引用传递的存在是因为OOP.
一个实例是数据和方法的组合, 往往映射到一个实体.
那么"按值传递"一个对象, 或者说"把数据memcpy一份来创建一个新对象"这个行为的语义可能是可疑的. 把一个Person实例这样复制一份对应现实中的什么呢? 新的Person涨工资了旧的Person应该怎样?

"复制出一个相等且独立的对象"这个需求当然也是存在的, 比如复制一个三角形. 不过这种事用拷贝构造函数就可以实现, 不必专门提供一个机制.

所以如果只实现一种"传递对象"的语义 (不像C++那么复杂), 传递对象的引用是比较不古怪的思路.

【热门文章】
【热门文章】