今天看《重构-改善既有代码的设计》这本书的时候,有提及到"Java按值传递"的思想,然后把已经关闭的电脑,重新打开,在Eclipse做一个简单的演练。

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

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值的方法。