2014-02-06 52 views
0

我有具有靜態成員也非靜態成員像類:當我們創建多個對象時,靜態塊會發生什麼?

public class StaticClassObjectCreations { 
    public static void doSomeThing() { 
     // TODO implementations static 
    } 

    public void nonStaticMethod() { 
     // TODO implementations for non static 
    } 

    public static void main(String[] args) { 

     StaticClassObjectCreations obj = new StaticClassObjectCreations(); 
     StaticClassObjectCreations obj1 = new StaticClassObjectCreations(); 


    } 

} 

,因爲我們可以看到number of object creation is not restricted和非靜態方法可以用new關鍵字創建的對象的幫助下進行訪問。

靜態方法或成員變量也可用於每個實例,也可以在創建對象時訪問它們。

現在我的問題是:JVM如何維護靜態代碼塊的實例,換句話說,當使用new關鍵字創建對象時,這些靜態塊會發生什麼情況。

謝謝。

+0

只有一次位於堆中的靜態字段值,靜態字段或方法不依賴於類對象。它們在應用中是獨一無二的。 – RustamIS

回答

7

靜態塊/變量/方法屬於Class,不屬於該類的實例。當Class被加載時,它們將被初始化。當您創建類的實例時,這些對它們沒有任何影響。即使你從一個實例中調用一個靜態成員,編譯器也會用它的類替換實例。

+2

很簡單的答案,但明確背後的想法。感謝和+1 – SAR

+0

接受,認爲可能會得到更多的想法,這就是爲什麼不接受答案,否則它是很好理解你的代碼的概念。 :) – SAR

1

如果你的問題是關於編譯器如何處理使用對象引用靜態方法調用,

public class StaticClassObjectCreations { 

    public static void doSomeThing() { 
     System.out.println("here"); 
    } 
    public static void main(String[] args) { 
     StaticClassObjectCreations obj = null; 
     obj.doSomeThing(); 
     StaticClassObjectCreations.doSomeThing(); 
    } 

} 

編譯器替換對象引用,其對應的類來調用靜態方法。即使obj爲null,編譯器也不會給出空指針,因爲它不需要對象引用來調用靜態方法。

+0

它確實增加了對靜態+1的良好理解 – SAR

2

假設有類A,B和C.

您已用C在A.初始化一個名爲 「dataArray中」 靜態數組

你在乙創建的實例(對象)和一個

這兩個對象的初始化不會影響A中的「dataArray」,因爲它是靜態的。它將爲B和C中的對象保存相同的數據。這是因爲靜態變量和方法處於類級而不是對象級。

注意:這是基於我的實驗。如果我錯了,請回復。

相關問題