【Java基础】值传递与引用传递的区别?

不想你离开。 提交于 2020-02-28 17:14:50

值传递

    值传递,是指方法调用时,传递的参数是按值的拷贝传递

    如:

public class ValueTest {
	public void test(int x){
		System.out.println("值传递,x:"+x);
	}
	public static void main(String[] args) {
		int x = 1;
		new ValueTest().test(x);
	}
}

引用传递

    引用传递,是指方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

    如:

public class ReferenceTest {

	public void test(Rf rf) {
		System.out.println("引用传递,rf:" + rf);
	}

	public static void main(String[] args) {
		Rf rf = new Rf(1, "张三");
		new ReferenceTest().test(rf);
	}

}

class Rf {
	private int id;
	private String name;

	public Rf() {
	}

	public Rf(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "id:" + id + ",name:" + name;
	}

}

区别?

    值传递后,改变传递参数,由于是拷贝一份,参数不会改变

    引用传递后,改变传递参数,引用是同一个对象,参数会改变

例子:

public class ReferenceAndValueTest {

	public void test1(int x) {
		System.out.println("获取到,x:" + x);
		x++;
		System.out.println("改变为,x:" + x);
	}

	public void test2(String str) {
		System.out.println("获取到,str:" + str);
		str = "李四";
		System.out.println("改变为,str:" + str);
	}

	public void test3(Rf rf) {
		System.out.println("获取到,rf:" + rf);
		rf.setName("李四");
		System.out.println("改变为,rf:" + rf);
	}

	public static void main(String[] args) {
		ReferenceAndValueTest vat = new ReferenceAndValueTest();
		int x = 1;
		System.out.println("调用前,x;" + x);
		vat.test1(x);
		System.out.println("调用后,x;" + x);

		String str = "张三";
		System.out.println("调用前,str;" + str);
		vat.test2(str);
		System.out.println("调用后,str;" + str);

		Rf rf = new Rf(1, "张三");
		System.out.println("调用前,rf:" + rf);
		vat.test3(rf);
		System.out.println("调用后,rf:" + rf);

	}

}

class Rf {
	private int id;
	private String name;

	public Rf() {
	}

	public Rf(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "id:" + id + ",name:" + name;
	}

}

执行结果:

调用前,x;1
获取到,x:1
改变为,x:2
调用后,x;1
调用前,str;张三
获取到,str:张三
改变为,str:李四
调用后,str;张三
调用前,rf:id:1,name:张三
获取到,rf:id:1,name:张三
改变为,rf:id:1,name:李四
调用后,rf:id:1,name:李四

解释:

    通过执行结果:(int)x 是值传递,(String)str 是值传递,(Rf对象)rf 是引用传递

总结

    Java中基本数据类型是以值传递的方式进行传参;

    对象类型是以引用传递的方式进行传参;

    String类型不属于基本数据类型,但是以值传递的方式进行传参;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!