关于Java里面的传值调用

很多人都把Java里面的“变量”说成是指向实际内存的引用,Thinking in Java中把这种变量称为句柄变量,而不是引用。这是有一定道理的。因为称为“引用”很容易令C++程序员迷惑。实际中Java中的机制和C++中的引用是不太一样的,尤其是在参数调用时。

请看下面这段代码:

import static java.lang.System.*; class Something{ private String name; public void setName(String nm) { name = nm; } public String getName() { return name; } } public class test { static void swap(Something i, Something j) { Something tmp = new Something(); tmp = i; i = j; j = tmp; out.println(i.getName() + " " + j.getName()); } public static void main(String[] args) { Something i = new Something(), j = new Something(); i.setName("Jack"); j.setName("Tom"); out.println(i.getName() + " " + j.getName()); swap(i, j); out.println(i.getName() + " " + j.getName()); } } 

输出将是:

Jack  Tom

Tom  Jack

Jack  Tom

如果把Java中的参数调用看成是引用调用,那么这个结果将令C++程序员不解。
我们可以使用句柄的概念来解释一下:句柄可以看做一个遥控器,通过这个遥控器控制实际的内存变量。在swap函数中,i和j分别代表 原“句柄变量”的副本,相当于另外一个遥控器。但是他们都指向相同的内存。在swap中交换的仅仅是两个句柄的副本,但是原来的句柄并没有变,所以这个swap是无效的。
为了解决这个问题,swap可以修改如下:
static void swap(Something i, Something j) { Something tmp = new Something(); tmp.setName(i.getName()); i.setName(j.getName()); j.setName(tmp.getName()); out.println(i.getName() + " " + j.getName()); } 
在Core Java中,作者将Something这种类称为mutable,即可修改的。因为它有自己的modifier(修改器),只有这样的类型可以使用以上的解决策略。而像基本类型和String类型等,由于它们没有提供自己的modifier,所以都可以看成是传值调用。

你可能感兴趣的:(java,c,String,Class,import)