[英]What happens in memory if we just declare a variable without initialization in java?
如果我們只是創建一個引用變量或為原始數據類型或引用數據類型聲明一個變量而不用如下所示的任何值進行初始化,那么在內存中會發生什么?
int x;
Employee emp;
那么兩種情況下記憶中到底發生了什么?
是否在此階段分配了任何內存,或者它是指向任何隨機位置還是指向null或指向垃圾值?
與第二種情況一樣,如果我們使用帶有new運算符的構造函數或使用任何其他方法創建對象,則只會在內存中創建空間。
Employee emp = new Employee();
Java虛擬機(JVM)從操作系統分配堆內存,然后為Java應用程序管理自己的堆。 當應用程序創建新對象(例如Employee emp = new Employee()
)時,JVM會分配一個連續的堆內存區域來存儲它。
雖然未初始化對象(例如, Employee emp = null
),但不需要分配任何內存。 但是,原始類型(在全局范圍內)使用默認值進行初始化,即使您未明確設置它(例如, int x
實際上是int x = 0
)。 所以在這種情況下,也將分配內存。
只要對象的引用保留在應用程序中的任何位置,對象就會保留在內存中。 不再引用的對象將由垃圾收集器(GC)處理,並將從堆中清除以回收其空間。
String
類也分配堆內存,雖然使用了一點調整:只要您使用相同的文本分配多個String
實例,就會使用String interning 。 所以,實際上你在內存中只有一個實例,但引用它的是多個變量。
如果它們是實例變量,則不指定任何值
然后對於基元 ,分配以下默認值:
布爾值 : false
字節 : 0
char : \\ u0000
短 : 0
int : 0
長 : 0L
float : 0.0f
double :0.0d
對象初始化為null
方法中的局部變量或變量必須在使用之前初始化,否則代碼將無法編譯。
原始類型將使用默認值啟動(0表示int,false表示布爾值,...)。 因此它將使用該類型的內存大小(int為32位)。 請參閱doc以獲取默認值和大小
其他對象將初始化為null
因此在內存中僅使用引用(通常是本機指針大小為32或64位, 請參閱此答案 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.