今天看《重构-改善既有代码的设计》这本书的时候,有提及到"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值的方法。