分享一道java值传递的例题

package Animal;


public class TransferTest {

	public static void main(String[] args) {
		TransferTest test = new TransferTest();
		test.first();
	}
	
	public void first() {
		int i = 10;
		Value v = new Value();
		v.i = 25;
		second(v, i);
		System.out.println(v.i);
	}
	
	public void second(Value v, int i) {
		i = 0;
		v.i = 20;
		Value val = new Value();
		v = val;
		System.out.println(v.i + " " + i);
	}
}

class Value {
	int i = 15;
}

这一道题目,算是比较全面的覆盖了java值传递的问题点;

首先我们调用first函数时,生成了一个Value类, 这时我们的v.i = 15, i = 10;

 由于我们v.i = 25, 所以v.i的值变为了25;

然后我们值传递传进去second函数,我们的参数一个是引用数据类型,另外一个是基本数据类型,第一个传的是一个实参存储数据的地址,第二个传的是实参真实存储的数据值。

所以我们进入second时间,我们的i 和 原来的i 只是数值一样,但是 second里面的i无论怎么变化都不会影响原有的i值, 然而,v.i的值发生了变化,变成了20, 但是我们又Value val = new Value(); 然后让v=val, 这个时候,我们的v已经变成了val,不是原来的v了, 所以我们输出的时候,输出的是val.i ,然后i由于变成0, 会输出0;

那么回到了first函数中,我们可以看到v.i这时候的值还是v.i = 20;

结果就是,

 不得不说,这个值传递确实很容易引起歧义;

如果我们改一改代码:Value val = new Value();去掉

那么答案就变成了

多想多试,java天下第一 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值