“Java有值传递和引用传递”为什么错了?
日期: 2020-03-04 分类: 个人收藏 386次阅读
前言
初学Java的时候,老师在课堂上说“Java有值传递和引用传递”,但网上“Java只有值传递”的呼声很高。
本人在查找资料的过程中,在这两个说法之间反复横跳。经过本人的整理后,其实还真的是Java只有值传递。
什么是值传递?什么是引用传递?
首先,我们先明确一下值传递和引用传递的定义(来自维基百科)。
值传递
When a parameter is passed by value, the caller and callee have two independent variables with the same value. If the callee modifies the parameter variable, the effect is not visible to the caller.
拙译:当一个参数进行值传递的时候,调用者和被调用者有两个值相同的独立变量。如果被调用者修改了参数值,并不会影响调用者。
引用传递
When a parameter is passed by reference, the caller and the callee use the same variable for the parameter. If the callee modifies the parameter variable, the effect is visible to the caller’s variable.
拙译:当一个参数进行引用传递的时候,调用者和被调用者使用同一个变量。如果被调用者修改了参数值,调用者也会受到影响。
总结一下,值传递和引用传递最本质的区别在与,调用者和被调用者有没有使用同一个变量。
可能有人还是对这两个定义抱有疑问,没关系,我们用C++做个例子。
C++中的值传递和引用传递(不感兴趣可略过)
这里先说明下为什么用C++。因为C++的有指针概念,所以对于指针和引用是有做严格区分的,感兴趣的小伙伴可以看下这篇博客:C/C++中的值传递,引用传递,指针传递,指针引用传递。
基于需要,本文对C++的值传递和引用传递来进行简要说明。
C++的值传递
可以看到,a变量(地址为0x22fe4c)在调用f()函数,进行值传递的变量p(地址为0x22fe20)已经是另一个变量了,而且在改变p的值后,地址为0x22fe4c的内容并没有改变,即a的值没有改变。所以值传递无法改变传递的变量的值。
引用传递
可以看到,a变量(地址为0x22fe4c)在调用f()函数,进行值传递的变量p(地址为0x22fe4c)还是同一个变量,而且在改变p的值后,地址为0x22fe4c的内容变为0xff,即a的值发生改变。所以引用传递可以改变传递的变量的值。
总结一下,在C++中的值传递和引用传递在大体上是跟值传递和引用传递的定义相符的。也就是说这个定义是可以在编程语言中适用的。
Java中的值传递和引用传递
说明一下,System.identityHashCode()的作用是用来判断两个对象是否是内存中同一个对象,跟用==判断内存地址是否一样的效果一样,有疑惑的朋友可以看下这篇博客: 除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:Java基础 java
精华推荐