Java - 引用型別
阿新 • • 發佈:2018-12-12
Java - 引用型別
什麼是引用
除了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。!=的判斷規則也類似。