以下變量聲明是否有區別?Java中的變量垃圾回收
Class A {
private int a;
A(){
a= 2;
}
}
VS
Class A {
private int a = 2;
A(){
}
}
意志垃圾收集工作有什麼不同?
以下變量聲明是否有區別?Java中的變量垃圾回收
Class A {
private int a;
A(){
a= 2;
}
}
VS
Class A {
private int a = 2;
A(){
}
}
意志垃圾收集工作有什麼不同?
兩次初始化的行爲沒有區別。在第一個示例中,a = 2
將在構造函數代碼被調用之前發生。如果你做a
決賽:
private final int a; //first example
private final int a = 2; //second example
那麼你會看到之間,你可以在構造函數中做什麼區別:
A(){ //The blank final field a may not have been initialized for first example
}
A(){
a = 2; //The final field Apple.a cannot be assigned for second example
}
在您聲明int a
作爲類的成員變量兩種情況。每當類被實例化時,空間將被放置在堆的那個整數上。但是,垃圾收集器只關心是否有任何對已經實例化的包含對象的引用。無論你如何處理成員變量,對象都會留在內存中,如果有引用的話,那麼在這之後它就有資格進行垃圾回收。
但是,也許你認爲應該有所不同?這是爲什麼?
不,沒有區別,因爲java編譯器內部在構造函數內初始化「private int a = 2」。你可以使用java反編譯器來確認我的上述語句。所以對於兩個GC將工作相同。
在第二個示例中,您未指定可見性修飾符。 – Jeffrey
如果它具有相同的訪問修飾符,該怎麼辦? – Paneri
這個問題與垃圾收集有什麼關係? – mazatwork