什么是引用
除了8种原始类型,其他类型都是引用类型,包括字符串、数组和文件流。
reference variable就是以某种方式存储对象所在的内存地址的变量。
比如上图,有两个Point类型的对象,他们的内存地址是1000和1024。有三个引用point1、point2和point3,point1和point3指向地址1000的那个对象,point2指向1024那个对象。point1和point3存储1000的值,point2存储1024的值。
引用或者保存对象的内存地址,或者不指向任何对象,此时,他们保存null引用。不能引用原始变量。
=的意思
假如有两个原始变量lhs和rhs,对于
lhs = rhs;
的意思是,保存在rhs的值,被拷贝到原始变量lhs。以后修改lhs或者rhs不影响另一个。
对于对象,=的意思相同:保存的值被拷贝了。如果lhs和rhs是引用,赋值以后,lhs引用rhs引用的对象。就是说拷贝了地址。lhs之前引用的对象不再被lhs引用,如果该对象不再被引用,就可以被GC回收了。
参数传递
由于使用值调用(call-by-value),实际参数被送给形式参数。如果参数是引用类型,形式参数现在引用的对象就是实际参数引用的对象。
比如下面的代码:
public static void clearButton(Button b) {
b.setLabel( "No" );
b = null;
}
clearButton方法返回的时候,b指向null,yesButton还指向以前的对象。
==的意思
对于原始类型,如果保存的值相同就返回true。对于引用类型,含义不同。
如果两个引用类型引用的是同一个对象(或者都是null),就返回true。比如
Button a = new Button( "Yes" );
Button b = new Button( "Yes" );
Button c = b;
现在,有两个对象。第一个是a,第二个有两个引用b和c。b == c会返回true,而a == c会返回false。!=的判断规则也类似。