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