我们在调用方法的时候,时常会对方法进行参数传递,而在这里的参数传递,又分为值传递,和引用传递,那到底这两种参数的传递有什么不一样呢?
首先我们要明确值传递和引用传递,传递的是什么?我们看一下这一段代码
public static void main(String[] args) {
int a=1;
f(a);
}
public static void f(int b){
return;
}
如果传递的是基本数据类型,当线程调用这个方法时,会在当前虚拟机栈中压入f()的栈帧,这个时候,a 会将值传递给局部变量表里的 b 中,这个传参的过程就是值传递,虽然二者的值相同,但是存储的位置不同
变量 a 存在堆中,而 变量 b存在局部的栈空间中,二者指向常量池的同一位置。
public static void main(String[] args) {
Person person=new Person();
f(person);
}
public static void f(Person b){
return;
}
对于引用传递来说,引用数据类型传递的是对象,而new出来的对象存在与堆当中,这个时候传递进来的就是这个对象在对当中的内存地址。
person 和 b 指向同一块地址,而此时我们修改 对象b中的数据时,直接修改了 堆空间中的对象person。这就是我们说的引用传递。
总的来说,
引用传递的是对象的地址,值传递的是变量的值。
引用传递可以修改堆中的对象数据,而值传递不可以。
引用传递,两个对象变量是指向同一个对象(可以说是同一个对象),而值传递两个变量不相同