Java操作对象的一种基本方式:“别名”

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()之外的对象。输出结果如下:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值