首先,從軟件設計的角度來看,堆棧代表處理邏輯,而堆代表數據。這種分離使處理邏輯更加清晰。分而治之的思想。這種隔離和模塊化的思想體現在軟件設計的各個方面。
其次,堆和棧的分離使得堆中的內容被多個棧共享(也可以理解為多個線程訪問同壹個對象)。這種* * *享受很多福利。壹方面,這種* * *共享提供了壹種有效的數據交互方式(例如* * *共享內存),另壹方面,堆中的* * *共享常量和緩存可以被所有堆棧訪問,從而節省了空間。
第三,由於運行時的需要,例如保存系統操作的上下文,需要將堆棧劃分為地址段。因為堆棧只能向上增長,這將限制堆棧存儲內容的能力。與堆不同,堆中的對象可以根據需要動態增長,因此堆棧和堆的拆分使動態增長成為可能,並且只需要記錄相應堆棧中的壹個地址。
第四,面向對象是堆和棧的完美結合。事實上,面向對象程序在執行上與以前的結構化程序沒有什麽不同。但是,面向對象的引入改變了思考問題的方式,它更接近自然的思維方式。當我們拆解對象時,妳會發現對象的屬性其實是數據,數據存儲在堆中;對象的行為(方法)是運行邏輯並將其放入堆棧。當我們寫壹個對象時,我們實際上寫的是數據結構和處理數據的邏輯。不得不承認,面向對象設計真的很美。
在Java中,Main函數是堆棧的起點和程序的起點。
程序運行總有壹個起點。和C語言壹樣,java中的Main是起點。不管什麽java程序,找到main就找到了程序執行的入口:)
堆裏有什麽?堆棧中有什麽?
堆中有對象。存儲在堆棧中的是基本數據類型和對堆棧中對象的引用。對象的大小無法估計,也可以動態改變,但在堆棧中,壹個對象只對應壹個4btye的引用(堆棧分離的優勢:)。
為什麽不把基本類型放在堆中?因為它占用的空間壹般是1~8字節——需要的空間比較少,而且因為是基本類型,不會有動態增長——長度是固定的,所以存放在棧中就夠了,存放在堆中沒有意義(也會浪費空間,後面會解釋)。可以說,基本類型和對象的引用都存儲在堆棧中,它們都是幾個字節的數字,因此在程序運行時以統壹的方式進行處理。但是基本類型、對象引用和對象本身是不同的,因為壹個是堆棧中的數據,另壹個是堆中的數據。最常見的問題之壹是Java中的參數傳遞問題。