當前位置:首頁 » 服務存儲 » 子類對象在堆里存儲空間
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

子類對象在堆里存儲空間

發布時間: 2022-07-08 22:20:04

1. java中子類對象和父類對象的內存模型圖

左邊是棧空間,右邊是堆空間,棧空間的變數t儲存著一個指向堆空間某個對象的地址

2. Java中對象為什麼存放在堆內存

這是jvm約定的,並不為什麼的問題,運行時數據區就那幾塊,有各自的功能

3. c++的對象存儲在堆內存還是棧內存

堆內存就是你用new 修飾符創建的內容會在堆內存中開辟一段空間,存放new出來的對象,比如 new String("ABC"), 就在堆內存空間分配了一塊空間,它的內容是"ABC",而棧內存是你存放引用變數的地方,比如String a = new String("ABC")中 a這個變數就是在棧內存空間中分配了一塊空間,它指向堆內存中內容為"ABC"的地址。

棧(stack):主要保存基本類型(或者叫內置類型)(char、byte、short、int、long、float、double、boolean)和對象的引用,數據可以共享,速度僅次於寄存器(register),快於堆。
堆(heap):用於存儲對象。

基本類型的變數和對象的引用變數都是在函數的棧內存中分配
堆內存用來存放由new創建的對象和數組,在堆中分配的內存,由java虛擬機的自動垃圾回收器來管理

棧對與函數調用和遞歸是很有用的,比如你定義的函數的參數存放地址,返回地址,在棧里是有嚴格的順序的;堆在程序運行的時候分配,堆內存也稱動態內存,在C語言里有malloc()和free()兩個函數,C++里有new和delete關鍵字,Java里只有new了,程序運行完畢,堆也不存在了(除非你漏寫了free()或者delete).所以覺得能精通C或者C++很牛,也很不容易~

Java 把內存劃分成兩種:一種是棧內存,另一種是堆內存。在函數中定義的一些基本類型的變數和對象的引用變數都是在函數的棧內存中分配,當在一段代碼塊定義一個變數時,Java 就在棧中為這個變數分配內存空間,當超過變數的作用域後,Java 會自動釋放掉為該變數分配的內存空間,該內存空間可以立即被另作它用。

堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或者對象之後,還可以在棧中定義一個特殊的變數,讓棧中的這個變數的取值等於數組或對象在堆內存中的首地址,棧中的這個變數就成了數組或對象的引用變數,以後就可以在程序中使用棧中的引用變數來訪問堆中的數組或者對象,引用變數就相當於是為數組或者對象起的一個名稱。引用變數是普通的變數,定義時在棧中分配,引用變數在程序運行到其作用域之外後被釋放。而數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身占據的內存不會被釋放,數組和對象在沒有引用變數指向它的時候,才變為垃圾,不能在被使用,但仍然占據內存空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。

這也是 Java 比較占內存的原因,實際上,棧中的變數指向堆內存中的變數,這就是 Java 中的指針!

4. Java的對象的內容在堆內存中的存儲形式是怎樣的

java中數組是以對象形式存在的,棧中存儲的是數組對象的地址(即引用),而對象本身不存放在棧中,而是存放在堆中,使用時通過棧中的引用地址找到堆中的實際對象,這里的引用地址類似於C/C++中的指針。

5. C++里,對象存放在堆里和存放在棧里相比有什麼優勢嗎什麼情況下該優先考慮存堆里

樓上兩位回答都挺好的,我來總結下
第一,堆空間大,適合放數組以及 類對象(系統自帶或自定義)
第二,裡面的數據不會自動清空,這樣就可以利用指針來訪問,(自動清空數據恰好是棧的優點)。所有在使用的時候要辯證來用,如果是用指針來訪問,就用堆,千萬不能用棧
第三、效率低,因為堆空間大,所以相對來說效率會低一點
第四、使用堆長期運行,有可能會導致內存碎片問題。
綜上所述,堆和棧要結合運行,充分利用兩種的優點。建議採用內存池來管理系統所需要的內存。

6. java中使用類創建對象後,該對象的方法在堆內存中是怎樣存儲的

方法不存在在堆內存中,是放在代碼區,只有在調用的時候,才會構建該方法的運行時環境,包括參數,局部變數等,當然,這些也都是在棧內存中的。對內存只存放被new出來的東西。
你可以讀讀編譯原理相關的書,這種問題就清楚了。

7. 子類對象在堆內存中的空間是不是也存儲了父類中私有的

4 位元組. 指針是無符號32位整數,存儲空間4位元組。

8. java 中子類繼承父類的欄位時,佔用的是同一塊內存還是父類和子類對象分別佔用各自的一塊內存,請高人詳答

java語言中的對象採用的堆和棧的形式來存放,例如 Father f = new Father();f存放在棧中,其實只是一個堆內存的地址,真正地對象保存在此地址所指向的堆內存中。
所以你的答案就顯而易見了,Father f = new Father(); Child c = new Child();這里Father是父類,Child是子類,f和c是兩個不同的內存地址,他們的對象保存的地方也不同,所以他們的欄位也不會再同一片內存區域。
如果父類中有個欄位a,子類繼承了父類的這個欄位a,其實就是子類的那個內存區域裡面也會有一個a欄位,父類的內存區域中也有a欄位,他們兩個沒有什麼關系。

9. Java定義的類對象都是在堆空間上是不是我在任何地方定義的類對象和數組都是在堆空間上的比如

不是 全局變數是在方法區中 私有屬性也就是成員變數在堆空間 望採納

10. 基礎問題 類對象是在棧裡面還是堆裡面

這個要看你是怎麼去構造這個對象的,一般來說,如果你用new來生成的對象都是放在堆中的,而直接定義的局部變數都是放在棧中的,全局和靜態的對象是放在數據段的靜態存儲區,例如: Class People;People p;//棧上分配內存
People* pPeople;pPeople = new People;//堆上分配內存