1. 程式人生 > >Java - 引用型別

Java - 引用型別

Java - 引用型別

什麼是引用

除了8種原始型別,其他型別都是引用型別,包括字串、陣列和檔案流。
reference variable就是以某種方式儲存物件所在的記憶體地址的變數。
An illustration of a reference

比如上圖,有兩個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; }

call-by-value
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。!=的判斷規則也類似。