**
Java参数传递是值传递
**
对很多人来说,Java参数传递是值传递还是引用传递,很迷惑。下面是笔者在看过这篇博客https://www.cnblogs.com/9513-/p/8484071.html,自己的理解。这是笔者的处女作,若有不对之处,欢迎指出,多多见谅~~
参数传递
1.Java中的参数的传递都是值传递,无论是基本数据类型,还是对象。
2.参数为基本数据类型是传递的值的副本拷贝,对参数的改变不会反映到原数据的值中。
3.参数为对象是传递的对象的内存地址的副本拷贝,是内存地址的值。
下面来看代码
class Value{
public int i = 15;
}
public class Demo2 {
public static void main(String[] args) {
Demo2 demo = new Demo2();
demo.first();
}
public void first(){
int i = 5;
Value v = new Value();
v.i = 25;
second(v, i);
System.out.println(v.i+" "+i);
}
public void second(Value v, int i){
i = 0;
v.i = 20;//(1)
Value val = new Value();//(2)
v = val;//(3)
System.out.println(v.i+" "+i);
}
}
运行结果:
为什么呢?
答:在second方法的两个参数,第一个是一个Value对象,是first方法中v对象内存地址的副本拷贝(指向v);第二个是int类型对象,是first方法中i的值的副本拷贝。
1.在代码执行到(1)时,由于v是first方法中v的内存地址副本,也是指向v,
Debug中,执行到21行,v的id是18
执行到29行,v的id也是18,说明v指向同一对象
所以(1)行的操作就是对first方法的v对象进行操作,因此原对象v的i属性的值改变。
2.在代码执行到(2)行时,新创建了Value对象,内存开创了一块新空间存放,val是该内存空间的地址。继续执行到(3)行,将val(内存地址)赋给v,这是v存放的就是val的内存地址,输出的自然是val对象的值。
可以看到执行到31行,v的id变为val的id,此时v和val指向同一对象(val)
3.对于参数i,因为是基本数据类型,所以对它的改变不会反映到原本对象中。
最后,谢谢观看哦~