Java参数传递是值传递还是引用传递

**

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,因为是基本数据类型,所以对它的改变不会反映到原本对象中。

最后,谢谢观看哦~

发布了13 篇原创文章 · 获赞 0 · 访问量 118

猜你喜欢

转载自blog.csdn.net/weixin_43602614/article/details/103145030