2012-07-27 239 views
1

是否因Java中的每個對象創建都調用此代碼,因爲每個對象都會擴展對象?或者JVM以某種方式對其進行優化,以避免在堆中創建一些對象的許多對象。Java對象類,構造函數鏈接

這種方法究竟發生了什麼registerNatives()

package java.lang; 

public class Object { 
    private static native void registerNatives(); 
    static { 
    registerNatives(); 
    } 
+0

此代碼不會編譯。 – 2012-07-27 09:54:03

+0

:)不,不是我的代碼。這是從Jdk源代碼複製的。 – sij 2012-07-27 09:55:30

+1

http://stackoverflow.com/questions/335311/static-initializer-in-java的可能的副本 – 2012-07-27 09:56:19

回答

2

靜態塊只在加載類時執行一次。

如解釋herehere,每次初始化類的對象時都會執行的塊也可以定義:只刪除static關鍵字。

1

registerNatives().做什麼並不重要。這裏重要的是你已經把它放在靜態塊中。靜態塊在Java Class Loader加載類時加載並運行。所以它保證每個JVM只運行一次。

0

這裏的問題是構造函數鏈,而是靜態的。當JVM加載這個類,和JVM裝載當類被實例化或該類的任何靜態方法被稱爲類

2.靜態變量將被初始化。

所以這種靜態塊將每運行一次JVM裝載的類。