天天看點

JVM:類加載的過程——準備。

        準備階段是正式為類變量配置設定記憶體并設定類變量初始值的階段,這些變量所使用的記憶體都将在方法區中進行配置設定。這個階段中有兩個容易産生混淆的概念需要強調一下,首先,這時候進行記憶體配置設定的僅包括類變量(被static修飾的變量),而不包括執行個體變量,執行個體變量将會在對象執行個體化随着對象一起配置設定在Java堆中。其次,這裡所說的初始值“通常情況”下是資料類型的零值,假設一個類變量的定義為:

private static int value=123;
           

        那變量value在準備階段過後的初始值為0而不是123,因為這時候尚未開始任何Java方法,而把value指派為123的putstatic指令是程式被編譯後,存放于類構造器<clinit>()方法之中,是以把value指派為123的動作将在初始化階段才會執行。下表列出了Java中所有基本資料類型的零值。

資料類型 零值 資料類型 零值
int boolean false
long 0L float 0.0f
short (short)0 double 0.0d
char '\u0000' reference null
byte (byte)0

        上面提到,在“通常情況”下初始值是零值,那相對的會有一些“特殊情況”:如果類字段的字段屬性表中存在ConstantValue屬性,那在準備階段變量value就會被初始化ConstatnValue屬性所制定的值,假設上面類變量value的定義變為:

public static final int value=123;
           

        編譯時Javac将會為value生成ConstantValue屬性,在準備階段虛拟機就會根據ConstantValue的設定将value指派為123。