Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结
这个话题一直是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:若对本文哪里有不同见解或有所疑惑,可以指出来,一同探讨,若有错误之处还请多多见谅,提出来好做修正,感谢。
参考资料:
1.Stack Overflow:Is Java “pass-by-reference” or “pass-by-value”?
2.Wiki: Java Passes By Value
3.知乎上也有个挺清晰的分析:Java 到底是值传递还是引用传递?
Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结的更多相关文章
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- Java调用函数传递参数到底是值传递还是引用传递
今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...
- 关于java是值传递还是引用传递
一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
- 188W+程序员关注过的问题:Java到底是值传递还是引用传递?
在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个 ...
- [转帖]Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?
Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递? http://www.itpub.net/2019/12/03/4567/ 在逛 Stack Overfl ...
- 【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...
- 多图证明,Java到底是值传递还是引用传递?
开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见正文. 说到值传递和引用传递我们不得不提到两个概念:值类型和引用类型. 1.值类型 通俗意义上来说,所谓的值类型指的就 ...
- Java 到底是值传递还是引用传递?
关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的.还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么. 在开始深入讲解之前,有必要 ...
随机推荐
- 将简单的lambda表达式树转为对应的sqlwhere条件
1.Lambda的介绍 园中已经有很多关于lambda的介绍了.简单来讲就是vs编译器给我带来的语法糖,本质来讲还是匿名函数.在开发中,lambda给我们带来了很多的简便.关于lambda的演变过程可 ...
- centos7 hue安装
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- ionic2 安装与cordova打包
1.安装: cnpm install -g cordova ionic ionic start name cd name cnpm install 2.环境配置: http://www.cnblo ...
- SPRING BOOT跨域访问处理
尊重原创:http://blog.csdn.net/ruiguang21/article/details/77878933 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家 ...
- XML中文乱码问题
XML中文乱码问题
- php中使用head进行二进制流输出,让用户下载PDF等附件的方法
http://blog.csdn.net/jallin2001/article/details/6872951 在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这 ...
- 如何控制input框!
ENTER键可以让光标移到下一个输入框 只能是中文 屏蔽输入法 只能输入英文和数字 只能是数字 只能显示,不能修改 只能输数字,判断按键的值 function onlyNum() { ...
- 字符串API
string可以看成是多个字符组成的只读数组,也可以通过下标去访问某个字符 访问i位置的字符 : str[i] 字符个数: str.length 倒数第n个字符 : str[str.length- ...
- Dubbo底层采用Socket进行通信详解
由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n 通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...
- cpp - 输入输出
c语言面向过程 c++支持面向过程+支持面向对象 #include <iostream> using namespace std; int main() { int a; cout < ...