首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

java 别号机制

2012-11-22 
java 别名机制别名现象主要出现在赋的问题上:对基本数据类型的赋是很简单的.基本数据类型存储了实际的数,

java 别名机制
别名现象主要出现在赋值的问题上:

       对基本数据类型的赋值是很简单的.基本数据类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方.例如,对基本数据类型使用a=b,那么b的内容就复制给a.若接着又修改了a,而b根本不会受这种修改的影响.

           但是在为对象"赋值"的时候,情况却发生了变化.对一个对象进行操作时,我们真正操作的是对对象的引用.所以倘若"将一个对象赋值给另一个对象",实际是将"引用"从一个地方复制到另一个地方.这意味着假若对对象使用c=d,那么c和d都指向原本只有d的指向的那个对象.下面这个例子将向大家阐述这一点.

package com.glacier.demo;class Tank {int level;}public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubTank t1 = new Tank();Tank t2 = new Tank();t1.level = 9;t2.level = 47;System.out.println("1:  t1.level: " + t1.level + "       t2.level: "+ t2.level);t1=t2;System.out.println("2:  t1.level: " + t1.level + "       t2.level: "+ t2.level);t1.level=27;System.out.println("3:  t1.level: " + t1.level + "       t2.level: "+ t2.level);}}

运行结果:

1:  t1.level: 9       t2.level: 47
2:  t1.level: 47       t2.level: 47
3:  t1.level: 27       t2.level: 27

            tank类非常简单,它的两个实例(t1和t2)是在main()里建立的.对每个tank类对象的level域都赋予了一个不同的值,然后,将t2赋给t1,接着有修改了t1.在许多编程语言中,我们可能会期望t1和t2总是相互独立的.但由于赋值操作的是一个对象的引用,所以修改了t1的同时也改变了t2!这是由于t1和t2包含的是相同的引用,它们指向相同的对象.(原本t1包含的对对象的引用,是指向一个值为9的对象.在对t1赋值的时候,这个引用被覆盖,也就是丢失了;而那个不再被引用的对象会由"垃圾回收器"自动清理.)

这种特殊的想象通常称作"别名想象",是java操作对象的一种基本方式.在这个例子中,如果想避免别名问题的话可以这样写:

t1.level=t2.level;

这样便可以保持两个对象彼此独立,而不是将t1和t2绑定到相同的对象.但你很快会意识到,直接操作对象内的域容易导致混乱,并且,违背了良好的面向对象程序设计的原则.这可不是一个小的问题,所以从现在开始大家应该留意,为对象赋值可能会产生意想不到的后果.




2楼email_wangfu4天前 09:54
菜鸟来悄悄
1楼snwrking4天前 00:31
避免方式:n1. 首先不要这么用,一般t2赋值给t1后,t2一般就不要操作了,都是操作t1。比如构造函数赋值,onClick()等中赋值:nthis.context = context;nselectedObject = positionObject;n2. 要是真有这种赋值后又要操作t1,又要操作t2。就进行深拷贝。

热点排行