java - 值传递和引用传递
伊谢尔伦
伊谢尔伦 2017-04-17 17:25:38
[Java讨论组]

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

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
阿神

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

天蓬老师

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

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

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

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

天蓬老师

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

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

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

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

天蓬老师

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号