很多人都把Java里面的“变量”说成是指向实际内存的引用,Thinking in Java中把这种变量称为句柄变量,而不是引用。这是有一定道理的。因为称为“引用”很容易令C++程序员迷惑。实际中Java中的机制和C++中的引用是不太一样的,尤其是在参数调用时。
请看下面这段代码:
输出将是:
Jack Tom
Tom Jack
Jack Tom
如果把Java中的参数调用看成是引用调用,那么这个结果将令C++程序员不解。
我们可以使用句柄的概念来解释一下:句柄可以看做一个遥控器,通过这个遥控器控制实际的内存变量。在swap函数中,i和j分别代表原“句柄变量”的副本,相当于另外一个遥控器。但是他们都指向相同的内存。在swap中交换的仅仅是两个句柄的副本,但是原来的句柄并没有变,所以这个swap是无效的。
为了解决这个问题,swap可以修改如下:
在Core Java中,作者将Something这种类称为mutable,即可修改的。因为它有自己的modifier(修改器),只有这样的类型可以使用以上的解决策略。而像基本类型和String类型等,由于它们没有提供自己的modifier,所以都可以看成是传值调用。