Java 参数传递

首先,Java 应用程序有且仅有一种参数传递机制,即按值传递

什么是按值传递和按引用传递?

按值传递:

按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。

按引用传递:

按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

Java里,对象是按引用传递的。

public class test {
	public static void main(String[] args) {
		StringBuffer s = new StringBuffer("good");
		StringBuffer s2 = s;
		s2.append(" afternoon.");
		System.out.println(s);
	}
}

结果是:good afternoon.

对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的。

而Java 有且仅有一种参数传递机制,即按值传递。

JAVA的引用传进函数时 , 会复制一个引用与实参指向同一对象的引用, 操作的不是同一个引用。

public class test {
	static class A{
		int num = 10;
	}
	static void change(A a1) {
		a1.num = 20;
		a1 = new A();
		a1.num = 30;
	}
	public static void main(String[] args) {
		A a = new A();
		change(a);
		System.out.println(a.num);
	}
}

结果是:20
将引用a1作为参数传递到change()方法,注意:这里传递的并不是引用本身,而是一个引用的拷贝。也就是说这时有两个引用(引用和引用的拷贝)同时指向堆中的对象.
因为参数传递是值传递,传递进去的a1是个副本, 在change()方法中,又创建了一个A对象,并将“a1引用的拷贝”指向这个在堆中新创建的对象。
但是,"a1引用的拷贝"已经将堆中的A对象的num属性设置为了20,新建的对象属性num才是30。
在这里插入图片描述
所以当main()方法中,打印的结果是20.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值