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

值传递

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

    如:

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类型不属于基本数据类型,但是以值传递的方式进行传参;

转载于:https://my.oschina.net/Auhgnahz/blog/550729

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值