Java記憶體分配及值 引用的傳遞

2021-08-17 02:50:12 字數 3140 閱讀 8885

關於堆疊的內容網上已經有很多資料了,這是我找的加上自己理解的一篇說明文:

一、記憶體區域型別 

二、棧中放的東西,圖示:

1

2

3

4

inti  =2;//基本型別變數的資料

string s="abc";//s為引用

string s1=new string("a");//s1也是引用

三、堆存放示意圖:

對於string類的物件特別說明一下:

string a="abc";//

**在執行後在常量池中建立了乙個值為abc的string物件;

string b="abc";//

執行時,因為常量池中存在abc,所以就不再建立新的string物件了

string c=new string("xyz");

string d=new string("xyz");

/***class被載入時,"xyz"被作為常量讀入,在常量池中建立了乙個共享的值

*為"xyz"的string物件;然後呼叫到new string("xyz")的時候,會在堆裡建立這個string("xyz")物件。

*/string s1=new string("xyz");//

建立了兩個物件(乙個在常量池中,乙個在堆中),乙個引用(棧中)

string s2=new string("xyz");//

建立乙個物件(堆中),乙個引用(棧中)

string s3="xyz";//

建立乙個物件放在常量池中,乙個引用(棧中)

string s4="xyz";//

建立乙個引用,指向"xyz"

四、按值傳入還是引用傳入

理解了堆疊資料儲存,再來理解一下值傳遞和引用傳遞的概念;

1、基本型別:

public

class

changegender

public

static

void

main(string args)

輸出結果:

變性前:男

手術期間:女

變性後:男

經過了痛苦的手術後,發現自己還是個男的,這是為啥?換個寫法你就懂了:

public

class

changegender

public

static

void

main(string args)

輸出結果:

變性前:男

手術期間:女

變性後:男

懂了吧,傳給change()方法的引數值由boy傳遞,傳完就由girl這個變數來處理了,手術期間的那個值是girl這個變數的值,手術前後的那個值是boy的。這個過程可以用乙個故事總結一下:乙個男人不想做男人了,準備做手術換個性別,於是打**給快遞小哥(變數boy)把他送到醫院手術台上,快遞小哥見到醫生後,把那個男的交給了會變性的醫生(方法change()),快遞小哥就走了(快遞小哥還是快遞小哥),醫生開始工作,把他的性別變成女的(girl="女"),那個男的確實手術成功了,只是我們列印的變性後的屬性是快遞小哥的。故事結束,完美!

2、引用傳值

引用要這樣來理解:它是一根繩子,它系著乙個球(物件),但它不是球(物件),我們想找到球(物件),就得先找對應的繩子。

看栗子:

public

class

user

//getter、setter方法

public

string getage()

public

void

setage(string age)

public

static

void

main(string args)

}

輸出的結果是什麼?

18為啥是這個結果,還是來說個故事,你同學給你介紹物件,說這姑娘白白嫩嫩,漂亮地一塌糊塗,你說好呀好呀,那她多大呀?你同學是馬大哈,記不得年齡,就跟你說20歲(user.setage("20")),然後你說確定嗎?我才19歲,年齡大的一概不考慮,於是你同學就去找她的年齡(public void getgirlage(user user)),得到了年齡並把這個年齡儲存在大腦中(user.setage("18")),然後打**跟你說的時候,把年齡的資訊從大腦裡拿出來(user.getage()),18歲是你可以接受的年齡,於是你們就安排見面了...再一次,完美。

那再加個東西,你們看看:

public

class

user

//getter、setter方法

public

string getage()

public

void

setage(string age)

public

static

void

main(string args)

}

這裡輸出的值是20,看來物件是談不成了,這過程中到底發生了什麼呢?原來是你的同學找那個姑娘的年齡的時候,發現那個姑娘把你同學拉黑了,你同學好面子,還是得給你介紹,於是又找了乙個新的姑娘(user=new user();),還把年齡設成了18歲,你等啊等,等了半年也沒等到,於是你開始著急了,想知道這個姑娘的年齡到底是多少,於是列印輸出姑娘年齡,可是這個姑娘還是第乙個姑娘(你也根本就不知道還有第二個姑娘),得到的就是20,年齡雖然比你大一點,可是半年時間,你也想清楚了,年齡大一點體貼也挺好。於是。。。好了,依然完美!

就扯這麼多,堆疊中放的東西都是固定的,大家記憶一下就好,很簡單的。

java 值傳遞和引用傳遞

值傳遞 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。引用傳遞 也稱為傳位址。方法呼叫時,實際引數的引用 位址,而不是引數的值 被傳遞給方法中相對應的形式引數,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,方法執行中形式引數值的改變將會...

Java 值傳遞和引用傳遞

一 值傳遞 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,函式接收的是原始值的乙個copy,此時記憶體中存在兩個相等的基本型別,即實際引數和形式引數 後面方法中的操作都是對形參這個值的修改,不影響實際引數的值 看下面這個值傳遞的例子。public class transfertest publi...

Java的值傳遞和引用傳遞

值傳遞 值傳遞是基本資料型別的資料傳遞,是棧中的資料 基本資料型別的資料作為方法的引數進行傳遞,那麼在方法中會另外開闢乙個新的記憶體空間,跟原來的記憶體空間不是乙個記憶體空間,如果在方法中對引數的值進行更改,不糊影響原來的記憶體空間的值 如果非要獲取方法中修改後的值,則需要把修改後的值返回出來 引用...