在軟考的時候也接觸過值型別和引用型別,那時候應付做題還是能夠的,但是考完之後再突然面對這兩個詞彙,又認為迷茫無措了。如今想想,還是實踐吧,當時僅僅是簡單的了解了其原理,沒實用**來實現,所以僅僅能算是初步的,臨時的了解。這篇文章就是為了彌補初步的遺憾,進行深一步的學習。
理論聯絡實踐,才是對現實的超越。就像門和鑰匙一樣,完美結合才有防竊和安全之功效。所以,該篇文章的主要思路也是從理論和實踐兩個方面分別對「值型別和引用型別」進行具體闡述。
-------------------------------------------
理 論 篇------------------------------------
1.值型別
直接將記憶體儲存在棧內,由系統自己主動釋放資源的資料型別。簡單來說:值型別就好像現金,須要的時候直接用就能夠;
2.引用型別
由型別的實際值引用表示的資料型別。簡單來說:引用型別就好像是存摺,須要的時候必須先去銀行換成現金,然後使用。
3.兩者對照
先用一張簡單的圖表顯示,更為直觀易懂。
實 踐 篇
------------------------------------
看了上圖後,會對值型別和引用型別有個大概的了解,以下具體說說兩者在記憶體分配方面的差別。
如上表可知,值型別變數是在棧記憶體中分配空間,引用型別則是在堆記憶體中分配空間的。這麼說是什麼意思呢?通過以下的**例項和記憶體分配圖來看看吧。
//首先,構造乙個最簡單的類引用型別
publicclass myclass
//然後,對照值型別和引用型別
private static void main()
非常easy的一段**,我們就以此為例,配合記憶體分配圖,來具體對照一下值型別和引用型別在記憶體分配上的差別。
首先是他們共同的開始,那就是僅僅要是變數(無論是值型別還是引用型別變數)宣告後,都會在棧記憶體
中分配其對應的一部分空間。
例如以下圖:
至於這部分空間裡存放的是什麼東西,就要看這個變數是值型別還是引用型別了。
(1)值型別
i = 5; //值型別變數的賦值
當為值型別變數進行賦值時,棧記憶體中存放的就是這個值型別自身的值。例如以下圖所看到的:
由圖可知,值型別變數本身所佔的記憶體中就存放著其值,就好比上文提到的「現金」一樣,須要用的時候直接使用就能夠,非常easy,一步就可到位。
(2)引用型別
mc = new myclass(); //建立引用型別變數
當為引用型別變數時,不只須要在棧記憶體中為其分配空間,也要在堆記憶體中為其分配適當的空間。只是這裡須要注意,須要了解的就是
---棧記憶體中存放的是什麼?堆記憶體中存放的又是什麼?還是看圖來說話吧:
由圖可知,引用型別變數的值是存放在堆記憶體中的,在棧記憶體中存放的則是該變數在堆記憶體中相相應的首位址,就好比是「存摺」一樣,棧中存放的僅僅是存摺的賬號,須要使用時,我們還須要依據棧中的「賬號」找到堆記憶體中相相應的「現金」,然後才可使用。
不知道講到這裡,讀者朋友們理解了值型別和引用型別的差別了嗎?尤其是在記憶體分配方面的差別,這是其本質上的不同。期待與您的交流~
值型別與引用型別
直白點兒說 值型別就是現金,要用直接用 引用型別是存摺,要用還得先去銀行取現。麥機長 我覺得這話十分形象。宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址...
值型別與引用型別
工作許久了,可是對c 中的值型別和引用型別卻一直無法很好的理解。這兩天花了不少時間查詢資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日後自己檢視,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎麼理解值型別和引用型別!值型別資料直接在他自身分配到的記憶體中儲存資料,而引用...
值型別與引用型別
自動變數型別是指儲存於該程式 程序 堆疊空間的一種變數型別 注意此時的堆疊空間並不是組合語言上的堆疊,只是它的使用及釋放類似於堆疊的過程 這個變數型別的乙個特點是它在程式執行時存在,在程式結束時消失。正是這個過程類似於彙編裡棧的操作,所以才將其命名 處理 為堆疊。我們平時所定義的int之類的型別都屬...