1、源码
class Number {
int i;
}
public class Assignment {
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.i = 9;
n2.i = 47;
System.out.println("1 : n1.i : " + n1.i +
", n2.i : " + n2.i);
n1 = n2;
System.out.println("2 : n1.i : " + n1.i +
", n2.i : " + n2.i);
n1.i = 27;
System.out.println("3 : n1.i : " + n1.i +
", n2.i : " + n2.i);
}
}
Number 类非常简单,它的两个实例(n1 和n2)是在main()里创建的。每个Number 中的i 值都赋予了一个不
同的值。随后,将n2 赋给n1,而且n1 发生改变。在许多程序设计语言中,我们都希望n1 和n2 任何时候都
相互独立。但由于我们已赋予了一个句柄,所以下面才是真实的输出:
看来改变n1 的同时也改变了n2!这是由于无论n1 还是n2 都包含了相同的句柄,它指向相同的对象(最初
的句柄位于n1 内部,指向容纳了值9 的一个对象。在赋值过程中,那个句柄实际已经丢失;它的对象会由
“垃圾收集器”自动清除)。
这种特殊的现象通常也叫作“别名”,是Java 操作对象的一种基本方式。
2、方法调用中别名的处理
class Letter {
char c;
}
/**
* 将一个对象传递到方法内部时,也会产生别名现象。
* @author HaoBoy
*
*/
public class PassObject {
static void f(Letter y) {
y.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
x.c = 'a';
System.out.println("1 : x.c : " + x.c);
f(x);
System.out.println("2 : x.c : " + x.c);
}
}
在许多程序设计语言中,f()方法表面上似乎要在方法的作用域内制作自己的自变量Letter y 的一个副本。
但同样地,实际传递的是一个句柄。所以运行:
y.c = 'z';
实际改变的是f()之外的对象。输出结果如下: