之前,对JAVA的变量引用中的“引用”一词理解的不是那么深,总是受到C中变量赋值的旧观念影响,突然又回想到了这个问题,写下来以供分享。
对于C语言来说,变量的赋值就是在此变量地址所对应的内存中存储对应的值,例如 :
a = 3;
b = a;
c = a;
赋值完成后,b和a再无关系,c也一样,只是3个变量的值相同而已,改变a不会对b和c造成任何影响。
对于JAVA来说,出来基本数据类型(long, int, short, byte, char)的赋值于C相同以外,对于类的赋值,其实都是引用,本质上没有新分配内存给新的类实例(new除外,此处着重说明引用已存在的类实例),仅仅是在变量和实例间创建了连接,即引用。这也就是说,最重要的一点,如果这个类实例发生了改变,那么所有引用此实例的变量都会发生变化。例如:
Date a = new Date();
Date b = a;
Data c = b;
此时,若a(或b,c)调用Date的方法改变了这个实例的时间,那么a,b,c所对应的时间将全部改变,从而容易产生错误。
实例:
之前做的一个小东西,有一个类Box,多个Box实例需要存储对应的PointF,我当时这么写:
PointF point = new PointF();
for(Box box : BoxLab) {
point.set(x++, y++);
box.setPoint(point);
}
Box{
…
public void setPoint(PointF p) {
mPoint = p;
}
…
}
代码可能不太准确,但希望能明白我的意思,然后造成我所有的Box实例中的point值是一模一样的,都是循环跳出之前的那个point值。