Java里的传引用和传值的区别是什么
基本概念
- 传值
传值就是指将一个值传递到方法的内部。例如int a = 5
,那么也就是给int
型变量a
赋值,值为5
.如果一个方法,将这个变量传进方法的内部,则进行的就是传值。在Java
中,有8
种基本数据类型,它们分别为:int、long、float、double、char、boolean、short、byte
.这8
种基本的数据类型作为参数进行传递是,都是进行的传值。·除此之外,还有一种特殊的情况,String
。本身String
是一个引用类型,很多人认为在向方法中传递String
类型参数时,是进行传引用。其实在这里,String
可以看做为一个包装类,因为String
其本身就是通过字符数组实现的,那么它在实现参数传递的时候,也就是以char
型数据的方式进行的,也就是进行传值。 - 传引用
java
中的引用可以初步的理解为地址。也是在new
了一个对象后,该对象是存在JVM
的Heap
区,也就是堆。那么必然有一个地址要指向这个对象的在JVM
中的位置,那么,指向这个对象的这个地址就可以简单的理解为“引用”。
实践
Java
确实使用对象的引用来做计算的,所有的对象变量都是引用。但是,Java
在向方法传递参数时传的不是引用,是值。
以 swap()
函数为例:
public void swap(int var1, int var2)
{
int temp = var1;
var1 = var2;
var2 = temp;
}
当swap
方法返回时,被当作参数传入的变量仍然保持了原来的值不变。如果我们把传入的int
型变量改为Object
型也是一样的,因为Java
通过传值来传递引用的。
原因分析
Java
复制并传递了“引用”的值,而不是对象。因此,方法中对对象的计算是会起作用的,因为引用指向了原来的对象。但是因为方法中对象的引用是“副本”,所以对象交换就没起作用。交换动作只对方法中的引用副本起作用了,不影响方法外的引用。所以不好意思,方法被调用后,改变不了方法外的对象的引用。如果要对方法外的对象引用做交换,我们应该交换原始的引用,而不是它的副本。