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