簡體   English   中英

java中靜態變量和方法在哪里加載?

[英]Where does static variables and methods are loaded in java?

我有點困惑靜態變量和方法在哪里加載。 我們說靜態變量和方法加載在靜態內存中。 bt public static void main() 被加載到堆棧中。由於 main() 方法也是靜態的,那么 main 是如何加載到堆棧中的。 而且還是靜態方法,變量存儲在不同的位置,因為我們說方法在內存中的不同位置加載。

堆棧是調用/執行時發生的事情。 它是否是靜態的並不重要。 任何正在運行的函數都會進入堆棧,在那里它是局部變量,並且所有函數都被保留,直到堆棧幀被彈出。

例如,我可以讓main()一遍又一遍地遞歸調用main() 每個都是一個新的堆棧幀。 它是一個靜態函數的事實並沒有改變這一點。

另一方面,靜態變量則不同。 它們只會有一個實例,您明確知道。 因此,它們可以進入特殊存儲並被區別對待(就像類定義等其他全局事物一樣)。

這個的實際實現不是很有用,也不容易理解。 但是,它的模型可能會幫助您了解這些東西的用途。

首先,Java 中的數據和代碼是完全不同的動物。 變量將具有在運行時更改的值; 代碼從不這樣做。 所以當你實例化一個類時,你永遠不會得到代碼的另一個副本。

考慮類Class - 它的實例存在,程序中的每個完全限定類都有一個。 我認為一個類的所有代碼,無論是否靜態,都與它的Class實例相關聯——如果你願意,可以用它“加載”它。 順便說一句,巧合的是,這也是我認為它的靜態變量被“加載”的地方。

但是實例變量需要多個副本——每當您實例化類時,您都需要它們的另一個副本。 因此,它們在實例化時與類的實例相關聯(或加載)——將指向類的指針視為指向包含該類所有實例變量的結構的指針,以及指向其方法的跳轉表的指針, 等等。

我不知道你所說的public static void main被“加載到堆棧上”是什么意思。 你是說代碼嗎? 代碼本身永遠不會進入堆棧。 將來自(普通)類的代碼放在堆棧上,在當前方法返回時丟失,然后在調用該方法時必須再次加載它是沒有任何意義的。

我認為你的問題的一部分我沒有回答,因為我不明白你在問什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM