首先,你要明白什麼是變數。變數的實質是一小塊記憶體單元。這一小塊記憶體裡儲存著變數的值,比如int a =1;a就是變數的名,1就是變數的值。而當變數指向乙個物件時,這個變數就被稱為引用變數,比如a a =new a();a就是引用變數,它指向了乙個a物件,也可以說它引用了乙個a物件。我們通過操縱這個a來操作a物件。 此時,變數a的值為它所引用物件的位址。舉個例子來加以說明:
string str1="string";
str1有本身的記憶體,是乙個變數,而物件"string"也有它自己的記憶體空間,此時就說str1引用了"string"這個物件。
string str2=null;
這裡的str2也是乙個引用變數,只是它沒有引用任何的物件。
如果將str1賦值給str2,即:
str2=str1;
那麼str2與str1都是同乙個引用變數,他們的值也就是具體物件的首位址(首位址也就是記憶體位址)。jvm會知道它們是不是引用變數(相對於原始型別int ,long等變數),jvm知道乙個變數為原始變數的時候就會根據它們的值(乙個位址值)再去訪問具體的記憶體空間,也就是訪問到具體的物件.因為
str2=str1;
就是把str1的值(乙個位址值)複製給str2,所以在執行的時候jvm發現str2也是乙個引用變數,就根據它的值(與str1的值一樣) 去訪問具體的記憶體空間,因為str2與str1的值相等,所以說:str2與str1引用對乙個物件.
既然了解了引用,接下來講解一下引用傳值的問題:
stringbuffer sb=new stringbuffer();
sb是乙個引用變數,當執行到new stringbuffer()的時候就會分配一段記憶體空間給這個物件使用,並把這段空間的首位址返回,也就是把首位址返回給sb變數,就形成了"sb引用這個物件".例如:public void addstring(stringbuffer sb1)
下邊這段**:
stringbuffer sb = new stringbuffer();
addstring(sb);
system.out.println(sb.tostring());
結果是:hhfunction
addstring(sb);實際就是把sb的值(什麼值?想想)傳給方法裡的引數,那個方法的引數stringbuffer sb1只是乙個引用變數,當執行這句**的時候就是把sb的值傳給sb1,然後執行方法時的**,sb1與sb都是引用同乙個對像,因為它們的值相同.所以在方法裡訪問sb1實際就是訪問原來sb所指向的那個物件.
相當與下邊這段**
stringbuffer sb = new stringbuffer();
stringbuffer sbe=null;//這裡相當與方法的引數
sbe=sb;//呼叫方法的時候就會執行這樣的結果,把sb的值給與sbe
結果也是hhfunction.
如果將stringbuffer用final關鍵字來修飾的話,以上例子將變成如下的樣子:
final stringbuffer sb=new stringbuffer();
那麼,問題來了,當使用final這個關鍵字來修飾sb這個變數時,是引用變數不能變,還是引用的物件不能變?
答案是引用的變數不能變,因為當new乙個stringbuffer的時候已經給
stringbuffer這個
物件分配了記憶體空間,
並把這段空間的首位址返回給sb變數,所以sb變數就不能再修改了,但是
引用變數所指向的物件中的
內容還是可以改變的,
所以有人在定義方法的引數時,可能想採用如下形式來阻止方法內部修改傳進來的引數物件:
public void method(final stringbuffer param)
實際上,這是辦不到的,在該方法內部仍然可以增加如下**來修改引數物件:
何為Java引用
string str aa str有本身的記憶體,是乙個變數,而對像 aa 也有它自己的記憶體空間.這時候說str引用 aa 這個對像.string tt null 這裡的tt也是乙個引用變數,但是它沒有引用具體的對像.string str aa string tt str 這裡str與tt都是乙個...
java 軟引用 弱引用 虛引用
軟引用 用softreference類來標記,被軟引用標記的物件,只有在記憶體不足的時候,gc才會 該物件。弱引用 用weakreference類來標記,被弱引用標記的物件,在gc時,無論記憶體是否充足,都會被 掉。虛引用 用phantomreference來標記,虛引用需要有乙個與之關聯的引用佇列...
JAVA物件引用
等於運算子可以使用任意類到的運算元。基本資料型別的值可以比較。如果運算元同是 其它的物件型別 比如使用者建立的類 那麼計算結果取決於運算元是否引用相同的物件。考 慮 下下面的例子 string1 string2 在這個例子中,string1和string2必須引用同乙個字串而不是兩個不同的字串,即使...