这个话题一直是 Java 程序员的一个热议话题, 争论不断, 但是不论是你百度搜也好还是去看官方的文档中所标明的也好, 得到的都只有一个结论: Java 只有值传递
在这里就不贴代码细致解释了, 让我们来看看一些论据:
1.
Java 总是值传递的不幸的是, 他们 (sun) 决定称 '一个对象的地址' 为 '引用'当我们传递一个对象的值的时候, 我们传递的是他的引用这会迷惑初学者
2.
问题的关键是,'引用'这个词在表达'通过引用传递'时有着与我们通常在 Java 中的'引用'一词完全不同的意思
在 Java 中'引用'通常意味着'对一个对象的引用'但在编程语言理论中技术术语'引用 / 值传递'是说的'一个存储着变量的存储单元的引用', 这是完全不同的
3.
摘自 Ken Arnold 和 James Gosling 的(前者不太熟后者我知道是 Java 之父)Java 程序设计语言 第二版(ps: 虽然现在都出第四版了):
有些人会错误的说: Java 中的对象都是 "引用传递"" 引用传递 "这个术语正确的意思是党一个参数传递给一个函数的时候, 调用函数获得一个原始值的引用, 而不是他的值的一个拷贝 (鄙人愚见: 这里所说的对原始值的引用即是我们常说的'传递的对象的一个拷贝') 如果这个函数修改了它的参数, 在调用代码中的值也会被改变, 因为参数与参数都是用的相同的内存槽很确定的, Java 只有一种传值方式 - 这有助于保持事情的简单性
4.
对于那些需要更多的 (证据) 来被信服的: 你不能用 Java 直接写一个交换函数去交换两个作为参数传递的值, 不论他们是对象还是单纯的值至今交换函数对于那些允许引用传递的语言来说都是微不足道的
因此 Java 是值传递的, 包括指向一个方法的对象的指针就这么简单
真正的问题在于 Java 喜欢称自己没有指针; 这是它作为一个安全的语言出名的一部分因此尽管它实际上有指针(比 C++ 更安全), 它必须称之为 "指针" 以外的东西 Sun 选择称之为 "引用", 尽管它不是业余的企业在区分 "指针" 和 "引用" 时通常所以为的意思 Java"引用" 不像 C++"引用"Java 有指向对象的指针, 它的值会被传递给方法
=============================== 分割线 ===============================
总结: Java 总是值传递的我们所以为的按引用传递, 其实传递的还是引用中地址的值(并且是它的一个拷贝), 也可以理解为指针的值让我们所疑惑的, 只是引用这个词的含义, 在 Java 中的引用和我们广以为的引用是有所不同的
ps: 若对本文哪里有不同见解或有所疑惑, 可以指出来, 一同探讨, 若有错误之处还请多多见谅, 提出来好做修正, 感谢
参考资料:
- Stack Overflow:Is Java pass-by-reference or pass-by-value?
- Wiki: Java Passes By Value
3. 知乎上也有个挺清晰的分析: Java 到底是值传递还是引用传递?
来源: https://www.cnblogs.com/chansblogs/p/8444524.html