简明现代魔法 -> Java编程语言 -> 引用与对象赋值时的别名现象

引用与对象赋值时的别名现象

2009-09-08

要对一个对象进行操作,我们真正能操作的是该对象的引用。

所以,如果需要“将一个对象赋值给另外一个对象”,实际上只是改变其中一个对象的指向,使2个reference都指向heap里的同一个对象。

一个简单的程序

package Phase1;

class Digimon {
	int attack;
	int defence;
}

public class aliasing {
	
	public static void main(String[] args){
		// 从类 Digimon 创建两个对象:亚古兽、加鲁鲁兽
		Digimon Agu = new Digimon();
		Digimon Kalulu = new Digimon();
		// 亚古兽的攻击力为9,加鲁鲁兽的攻击力为47
		Agu.attack = 9;
		Kalulu.attack = 47;
		// 输出下攻击数值
		System.out.println("亚古兽攻击力:" + Agu.attack + "; " + 
				"加鲁鲁兽攻击力:" + Kalulu.attack + "。 ");
		// 对object加鲁鲁兽赋给object亚古兽(误),结果如何?(实际只改了引用,对象不变)
		Agu = Kalulu;
		// 其实就是让指向亚古兽的reference指向加鲁鲁兽的对象了
		System.out.println("亚古兽攻击力:" + Agu.attack + "; " + 
				"加鲁鲁兽攻击力:" + Kalulu.attack + "。 ");
		// 将亚古兽的攻击力修正为27吧(注意,Agu现在已经指向加鲁鲁兽对象了)
		// 或者说,Agu现在也就是加鲁鲁兽
		Agu.attack = 27;
		// 看看输出测试吧
		System.out.println("亚古兽攻击力:" + Agu.attack + "; " + 
				"加鲁鲁兽攻击力:" + Kalulu.attack + "。 ");
	}
	
}

程序运行结果

亚古兽攻击力:9; 加鲁鲁兽攻击力:47。 
亚古兽攻击力:47; 加鲁鲁兽攻击力:47。 
亚古兽攻击力:27; 加鲁鲁兽攻击力:27。

当Agu = Kalulu;这一句代码执行之后,object亚古兽没有reference指向了,它将会被垃圾回收器自动清理。

这种特殊的现象称作“别名现象”,是Java操作对象的一种基本方式。

如果不想产生别名现象,可以这么写:Agu.attack = Kalulu.attack;

这样就可以保持两个对象彼此独立,而不是将两个reference同时绑定到同一个对象上面去。

随机文章推荐
网站分类


注:如需转载本文,请注明出处(原文链接),谢谢。更多精彩内容,请进入简明现代魔法首页。

进入新博客
喜欢本文,就分享它吧
给我留言
您的名字:
您的邮件:
您的网站:


 

copyright © 2009 简明现代魔法    学习、分享、进步

power by Gonn 感谢所有关心和支持本站的朋友们