上节我们探讨了Java中对象的赋值原理,在此基础上引出了“别名现象”这一概念。本节将要讲解的是“方法调用中的别名问题”,将一个对象传递给方法时,也会产生别名问题。下面的这个例子将向大家阐释这一点:
package assignment;
class Letter {
char c;
}
public class PassObject {
static void f(Letter y) {
y.c = 'z';
}
/**
* @param args
*/
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);
}
}
程序运行结果如下:
1: x.c: a
2: x.c: z
在许多编程语言中,方法
f()似乎要在它的作用域内复制其参数
Letter y的一个副本:但实际上只是传递了一个引用。所以代码行
y.c = 'z';
实际改变的是
f()之外的对象。
别名引起的问题及其解决办法是很复杂的话题,但是最起码你现在就因该知道它的存在,并在使用中注意这个陷阱。