Java中,为什么无法利用交换对象的方法实现交互数据的效果

public class SwapTest {
	public void swap(int x,int y) {
		int temp=x;
		x=y;
		y=temp;
		System.out.println("x="+x+",y="+y);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a=1;
		int b=2;
		SwapTest one=new SwapTest();
		one.swap(a, b);
		System.out.println("a="+a+",b="+b);
	}
}

如上面代码所示,当两个对象使用交互数据的方法时,会出现什么结果呢?
结果
答案似乎并不是我们想要的,a和b的数据并没有成功交互。

这是因为java这门语言总是采用按值调用,而非按引用调用,那么,什么是又按值调用?
专业术语中是这样解释按值调用的:按值调用表示方法接收的是调用者提供的值。 我将举一个形象一点的例子来解释一下值,对象和方法三者之间的关系。

  • 首先,想象一个空的杯子,如果你手边有的话就更好了,这个杯子就相当于一个实例域,例如int类型的数值范围是-2147483648到2147483647,我们假设一个较小的范围,并去掉负数,0到100。当杯子的状态为空时,数值就是0,当杯子的状态是满的时候,数值就为100。
  • 而对象就想象成一个吸管,对象指向值域的方式就相当于吸管插进杯子里,通过这根吸管(对象)来加水或者抽水,就可以完成改变数值的操作。
  • 而在java中,当方法操作对象(即对象调用方法)时,方法操作的并不是调用方法的对象,而是这个对象的拷贝,你可以想象成一根一摸一样的吸管也插入这个杯子中,方法正是通过第二根吸管注水或者抽水,当方法执行完毕后,第二根吸管就会被扔掉,重新回到一根吸管一个杯子的状态,但是这时杯中的水量已经发生了改变。
  • 文章开篇中的代码就是将杯子A中的第二根吸管和杯子B中的第二根吸管进行了交换,但是当方法结束时,这两根吸管就会被扔掉,相当于什么都没有发生过,这就造成了无法实现交互数据的效果。

解决方法可以利用反射机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值