关于Java按值传递的学习

本文探讨了Java中的值传递概念,并通过实例演示了基本类型和引用类型在方法调用中的行为差异。特别关注了如何修改传入参数的值,以及这些变化如何影响原始对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看《重构-改善既有代码的设计》这本书的时候,有提及到"Java按值传递"的思想,然后把已经关闭的电脑,重新打开,在Eclipse做一个简单的演练。(我比较笨,只能通过无数的次的main方法不断的测试,原主赐予我智商!阿门!)

在一个方法中,我们一般都会接收参数。如果在这个方法内部,我们不小心修改了传递进来的参数的值,那么结果会什么样呢?如下方法:

	public  Object changeObject(Object obj){
		if(obj instanceof String)
			obj = new String("changeObject");
		else if (obj instanceof Boolean)
			obj = new Boolean(true);
		else if (obj instanceof Double)
			obj = new Double(100);
		else if(obj instanceof StringBuffer)
			obj = new StringBuffer("new StringBuffer ");
		return obj;
	}
在上述这个方法中,我们在找工作的笔试过程中会碰到,在各种考试中也会碰到。一般是会咨询:如果参数变量value=1,那么调用方法之后,返回值是什么?value值是什么?


按照Java的按值传递思想,参数的值是不会被改变的,也就是不会被重新赋值。换个角度来说,传递的参数可以作为方法的内部变量,其生命周期与方法一样,方法作废,它也就“作废”了。可以有另外一种情况,比如以下方法:

	public ArrayList<String> changeArraylist(ArrayList<String> list){
		list.add("fish");
		list.add("fish");
		list.add("fish");
		return list;
	}

如果说,我们声明了一个空的list,作为参数传递给changeArraylist方法,那么调用该方法,返回的值是什么?调用后list会编程了什么?

测试一下,会发现,返回的结果与list的结果一样:list的值变了!不再是空,而是与返回值一样!

这是为什么呢?(请原谅我学艺不精,无法解释清楚这种现象!)

另外一种情况,如果我们的方法如下:

	public ArrayList<String> changeArraylist(ArrayList<String> list){
		list = new ArrayList<String>();
		list.add("fish");
		list.add("fish");
		list.add("fish");
		return list;
	}
此时调用后返回的结果,与上面的方法一致。而list的值,保持不变!

这种现象,充分说明了list只是作为了方法的内部变量参与了计算,方法无效了,它也就“作废”了。当它的职责完成以后,它也就回归本位!


PS:据说,java的new操作,实际上创建了一个对象实例。而等号的赋值操作,只是把变量指向了对象的一个实例的引用。

可以尝试用这种说法去解释上述一种可以改变传入参数list的值,一种不可改变list值的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值