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

在Java語言的學習過程中最重要的就是理解好堆和棧,因為java的面向對象特性跟堆和棧的分離密切相關,所以細致深入地理解。

1.我不知道有沒有人會疑惑,為什么java要把堆和棧分開呢?堆能存儲東西,難道棧就不能了嗎?在運行的時候不就是把數據放在棧中嗎?

(1)是的,確實是這樣的,正如之前所說的棧是負責運行時的,而堆是負責存儲信息的。不知道大家有沒有了解設計模式里面的一些原則,其中有一條的為對象之間的松耦合而努力,在用在這里同樣適用,把棧和堆分離開來,可以使處理邏輯的條理更加清晰,這種原則我覺得在設計軟件的時候要注重,套用一個詞就是分而治之,后面講到的垃圾回收是不是就變得可行了呢?

(2)從線程共享的方面來看,堆和棧的分離,可以使堆的信息是線程共享(或者說是棧共享的)的,這樣就為多線程同時訪問一個對象提供了可能。而這樣方式對于數據交互是有效的(通過共享內存),而且堆中的共享常量和緩存可以給多個棧訪問,節約了空間。

(3)套用某個大神的話來說,面向對象就是棧和堆的完美結合。這個怎么理解會比較好呢?認真的想一想,我們平時一般創建一個對象是不是就是把事物的特征抽象出來,但是調用方法呢?是不是就是相當于處理一個個的邏輯,既然是邏輯是不是就是跟棧密切相關?所以說面向對象的實現跟堆和棧的結合是分不開的。


2.我們還需要重點記住的就是,在java中程序的入口一定是Main函數, 也就是棧的起點,因為我們都是在棧中處理邏輯的。

3.接下來,我們就要想一想了,到底堆中存的是什么?棧中存的是什么?

對于堆中要存的數據,我覺得大家閉著眼都會,不就是一個個的對象嗎?那么棧中存的是什么呢?其實就是基本數據類型,以及對堆中對象的引用,這樣來說是不是就清晰了一點。

4.Java中的參數傳遞時傳值呢?還是傳引用?

(1)如果要理解這個,我覺得需要明白的一點是,在java中是沒有指針這個概念的,但是不要認為java中就沒有使用到指針。

(2)java的程序是在棧中運行的,在傳遞參數的時候,棧中只存在傳基本類型和對對象的引用的問題,并沒有傳對象的本身。

明白了上面的兩個原則,我覺得上面的問題就不難解答了,但是我們還需要注意的一點就是,傳遞的參數如果是基本類型的話,就不能夠更改他的值,如果傳的是對象的引用,我們可以改變對象里面的屬性,成員變量等。換而成一句話就是一個基本類型不能改變,但是有很多個基本類型組成的對象確實可以修改。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,374評論 11 349
  • 在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。 當在一段代碼塊定義一個變量時,Java就...
    木有魚丸啦閱讀 566評論 0 0
  • JVM內存模型Java虛擬機(Java Virtual Machine=JVM)的內存空間分為五個部分,分別是: ...
    光劍書架上的書閱讀 2,620評論 2 26
  • 一:java概述:1,JDK:Java Development Kit,java的開發和運行環境,java的開發工...
    ZaneInTheSun閱讀 2,690評論 0 11
  • 廖雪峰python 3教程 太好了。。。。 數據類型和變量 轉義字符\可以轉義很多字符,比如\n表示換行,\t表示...
    喵在野閱讀 369評論 0 1