深刻理解Java知識中的堆和棧

在Java語言的學習過程當中最重要的就是理解好堆和棧,由於java的面向對象特性跟堆和棧的分離密切相關,因此細緻深刻地理解。
1.我不知道有沒有人會疑惑,爲何java要把堆和棧分開呢?堆能存儲東西,難道棧就不能了嗎?在運行的時候不就是把數據放在棧中嗎?
(1)是的,確實是這樣的,正如以前所說的棧是負責運行時的,而堆是負責存儲信息的。不知道你們有沒有了解設計模式裏面的一些原則,其中有一條的爲對象之間的鬆耦合而努力,在用在這裏一樣適用,把棧和堆分離開來,可使處理邏輯的條理更加清晰,這種原則我以爲在設計軟件的時候要注重,套用一個詞就是分而治之,後面講到的垃圾回收是否是就變得可行了呢?
(2)從線程共享的方面來看,堆和棧的分離,可使堆的信息是線程共享(或者說是棧共享的)的,這樣就爲多線程同時訪問一個對象提供了可能。而這樣方式對於數據交互是有效的(經過共享內存),並且堆中的共享常量和緩存能夠給多個棧訪問,節約了空間。
(3)套用某個大神的話來講,面向對象就是棧和堆的完美結合。這個怎麼理解會比較好呢?認真的想想,咱們平時通常建立一個對象是否是就是把事物的特徵抽象出來,可是調用方法呢?是否是就是至關於處理一個個的邏輯,既然是邏輯是否是就是跟棧密切相關?因此說面向對象的實現跟堆和棧的結合是分不開的。java


2.咱們還須要重點記住的就是,在java中程序的入口必定是Main函數, 也就是棧的起點,由於咱們都是在棧中處理邏輯的。
3.接下來,咱們就要想想了,到底堆中存的是什麼?棧中存的是什麼?
對於堆中要存的數據,我以爲你們閉着眼都會,不就是一個個的對象嗎?那麼棧中存的是什麼呢?其實就是基本數據類型,以及對堆中對象的引用,這樣來講是否是就清晰了一點。
4.Java中的參數傳遞時傳值呢?仍是傳引用?
(1)若是要理解這個,我以爲須要明白的一點是,在java中是沒有指針這個概念的,可是不要認爲java中就沒有使用到指針。
(2)java的程序是在棧中運行的,在傳遞參數的時候,棧中只存在傳基本類型和對對象的引用的問題,並無傳對象的自己。
明白了上面的兩個原則,我以爲上面的問題就不難解答了,可是咱們還須要注意的一點就是,傳遞的參數若是是基本類型的話,就不可以更改他的值,若是傳的是對象的引用,咱們能夠改變對象裏面的屬性,成員變量等。換而成一句話就是一個基本類型不能改變,可是有不少個基本類型組成的對象確實能夠修改。
 設計模式

相關文章
相關標籤/搜索