Java中的参数传递方式到底是引用传递还是值传递?

Posted yexianyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的参数传递方式到底是引用传递还是值传递?相关的知识,希望对你有一定的参考价值。

Java中的参数传递方式到底是引用传递还是值传递?

事实上,Java中方法参数传递的是原来对象引用的copy(副本)。如果你在方法中改变这个copy中的内容,因为这个copy也是指向原对象,所以改变会生效。给你带来好像Java中存在地址传递一样。而实际上当你对这个对象的引用进行操作,例如object = new SomeObject();这样的操作是无效的,因为你改变的是这个copy(副本),原来的引用还是指向原来的对象,并没有发生变化。

下面举个例子来进一步说明吧。

 

  

 

 

运行结果:

Name =:Bob | Age =:21

Name =:Alex | Age =:24

 

解释:

我们的目的是想通过changeAttr函数,改变被传入的实参Person对象的成员变量。按照C++的思想,如果对象是以传址方式进行参数传递,那么必然可以达到我们的目的。但是Java已经明确规定参数是以传值方式进行传递的,并且从上面这个例子中可以看出,我们也确实达到了预期的目标。

 

这是怎么回事?这是因为Java中方法参数传递的值就是原来对象的引用的副本。请注意,这里的引用并不是当初在Person p = new Person() ;语句中声明的p。而是p的一个副本,我们姑且假设这个副本为p2。因此我们在方法changeAttr中相当于是在使用p2对原对象进行修改。又由于p2是指向原对象的(因为p2==p),所以我们用p2对原对象进行的修改并不会因为程序退出了而失效。

 

但是如果我们现在想用一个函数来改变p所指向的对象,结果又将如何呢?请看下面的例子。

 

运行结果:

Name =:Bob | Age =:21

Name =:Bob | Age =:21

 

解释:

我们企图在函数changeReference中改变实参p所指向的对象,结果却失败的。为什么呢?因为正向我们之前说的,函数changeReference中的引用只是原对象引用的一个副本,即p2,并不是p。既然如此,我们在函数中只是改变了引用p2所指向的对象,而没有改变引用p所指向的对象。所以才会有现在的运行结果。

以上是关于Java中的参数传递方式到底是引用传递还是值传递?的主要内容,如果未能解决你的问题,请参考以下文章

Java参数传递到底是按 值传递 还是 引用传递 ?

Java 到底是值传递还是引用传递?

Java 到底是值传递还是引用传递?

Java调用函数传递参数到底是值传递还是引用传递

JVM_Java到底是值传递还是引用传递

Java的参数传递是值传递还是引用传递?