代码先行,原理后知
后面有图解释证明它是拷贝
这里可能你会疑惑,变回来怎么就能证明入参是拷贝,而不是引用本身,你有这个疑问是因为概念不清!,请看下面的结论和定义。
摘抄整理。。。。。。
摘自:原文链接:https://blog.csdn.net/xiaojinlai123/article/details/88678367
定义:
值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参 数。
引用传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。(下面文章中 C++ 的定义,我 觉得这样说更精简形象一些,所以放了两个定义,其实意思是一样的)
定义关键1:是指在调用函数时将实际参数的地址直接传递到函数中(给形参了)
证明:Java 在进行方法调用传递引用类型参数的时候,就是先给形参一个与实参相同的地址的(此处与 C++ 的不同之处是,C++ 是别名,没有在内存中给形参开辟空间,而 Java 给形参开辟了一个栈内存空间,存放与实参相同的引用地址。但是这与引用传递的定义不违背啊!!!定义可没说形参是否有开辟空间的概念)。
定义关键2:在函数中对参数所进行的修改,将影响到实际参数。
证明:Java 在进行方法调用传递引用类型参数后,修改形参的内容后,就是影响了实参的值。
结论:
1 就 Java 语言本身来说,只有值传递,没有引用传递。
注意:(在 C++ 中的定义是“引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样”,再看引用其中的一个描述:“声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元”。因此这引用的概念在 Java 中根本不存在。Java 中哪有给变量起个别名的!!!
)
2 根据 值传递,引用传递的定义来说:
Java 中的基本类型,属于值传递。
Java 中的引用类型,属于引用传递。
Java 中的 String 及包装类,属于特殊群体,作为形参时,由于每次赋值都是重新创建了对象,所以形参会指向另一个地 址,因此实参没有变,看起来像值传递。
但是其特性已经破坏了,值传递、引用传递的定义。因此他们属于引用传递的定义,却表现为值传递!!!(String 表面看似值传递,但是内部是指向了另一个内存地址,当然不会对外面的实参进行更改啦)