在值传递的时候首先要分清楚什么是实参和什么是形参
在方法调用的中传入的参数是实参,在方法定义中的参数为形参
在方法调用的时候传入参数为实参例如 int a = 1; invok(a);//此时a为实参
在方法定义中的参数为形参,例如:public void invok(int a);//此时的a为形参
在值传递的时候将实参放入到方法中其实是先将a复制一份,将副本作为形参传递给方法中,
这样一来在栈中就有两份a的存在,一个是实参a,一个是副本a,就将实参和形参分开了,这样无论
副本a如何改变都不会影响到实参a的值,这样被称作为基本类型的值传递。
在引用传递中,传递的是对象的引用,在方法的调用过程中其实也和值传递的过程中都是一样的,也是分为
实参和形参,同样也是进行了实参的拷贝即形参,形参也会重新进行赋值,但是有一点基本类型和引用类型的
最大区别是引用类型受引用地址的限制,由于传递过程中堆中的地址只有一份无论形参内容如何改变堆内存的地址没变
所以对象中的值也就是实参中的值会变更为新的形参中更改的值。
两个最大的区别就是引用传递受对象引用地址的影响,但是过程中依然是值传递,因为都是会在调用方法的时候进行副本的拷贝
将拷贝的值传给方法。
区分值传递和引用传递主要是具体擦混的是值还是引用,主要看引用是否改变了,如果引用
没有改变那么传值为值传递,否则为引用传递,
需要注意一点的是:
如果在引用传递的中方法调用的的时候,将引用重新进行new,也就是重新创建对象,那么这时候直接就是引用类型了
例如: public void invok(Object a){
a = new Object();//此时新创建了对象,那么对象引用就会指向新的对象地址,这时候传递的过程中传递的是引用。
}
例一:
int a = 1;
invok(a);
public void invok(int a);//为值传递,实参a的值不受形参a的值影响
例二:
Car car = new Car();
car.setName = "baoma";
public void invok(Car car){
car.setName("benchi"); //此处引用地址没有改变所以是值传递
}
例三:
Car car = new Car();
cat.setName = "baoma";
public void invok(Car car){
car = new Car();
car.setName("falali"); //此处引用地址有改变将原先指向的car指向了新生成的car的内存地址,所以是引用传递
}