最近,我在 stackoverflow 上,看到了一个有意思的题目。Java 中到底是“值传递”还是“引用传递”?


java和c都是按值传递 java 值传递还是引用传递_java和c都是按值传递

回答数很多,点赞数也很多。很快就吸引了我的注意力!

通过我个人对通篇文章的阅读,得出了 3 个普遍被大家误导的错误!

错误1:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。 


错误2:Java 是引用传递。 


错误3:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

实际上,Java 中只有“值传递”!这并不是我一家之言,而是众多 stackoverflow 上众多网友的讨论的结果!


java和c都是按值传递 java 值传递还是引用传递_值传递_02

我选择了一个比较经典的答案,整理给大家!

java和c都是按值传递 java 值传递还是引用传递_值传递_03

最重要的一点理解是 Dog myDog,它实际上是指向“Dog”的指针。当我们调用 foo(myDog) 的时候,你实际上是将创建的对象的地址传递 Dog 给 foo 方法。

注意,Java 中的指针不是指地址。

现在假设 Dog 对象驻留在内存地址 是 42。这意味着我们将 42 传递给该方法。

参数 someDog 设置为值 42,在代码 “AAA” 处,someDog 跟随 Dog,它指向(Dog 地址 42 处的对象),要求Dog(地址为 42 的那个)将他的名字改为 Max。

在代码“BBB” 处,Dog 创建了一个新的。假设它所在地址是 74,我们将参数分配 someDog 给 74。

在代码“CCC” 处,someDog 跟随 Dog 它指向(Dog 地址 74 处的对象),要求 Dog(地址为 74 的那个)将他的名字改为 Rowlf。

然后,return 了。

Java 的工作方式与 C 完全相同。您可以分配指针,将指针传递给方法,按照方法中的指针操作并更改指向的数据。但是,您无法更改指针指向的位置。

Java 总是按值而不是通过引用传递参数。Java 把引用的地址当做值进行了传递,这么说,你应该就明白了!

上面我的解释,可能会遇到大家!