,如果我有以下情形:實例變量建立在Java
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
當中去創造第一,蘋果或香蕉?我想說蘋果首先被創造出來,但我不確定。
,如果我有以下情形:實例變量建立在Java
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
當中去創造第一,蘋果或香蕉?我想說蘋果首先被創造出來,但我不確定。
apple
首先被創建。它是靜態的,並且在父級別類中。作爲Baz
類是將具有可創建的Baz
實例之前發生加載
的靜態初始化(其初始化apple
變量)就會立即運行。
只要創建了Foo
的實例,就會運行初始化器(初始化變量banana
)。
apple
是一個靜態變量,因此它在類初始化時被初始化。在之前會出現,因此可以創建一個實例 - 因此在此特定情況下,它會在banana
之前初始化爲。
如果apple
是一個實例變量時,它仍然會banana
前初始化:彷彿初始化發生在構造函數體開始實例變量初始化,但任何鏈接到一個父類的構造之後。 (如果您有興趣,這與C#不同,其中實例變量初始值設定項在執行構造函數鏈之前執行。)
要創建類的實例,需要此類被加載和初始化,很顯然,靜態字段將在第一個實例字段被初始化之前被初始化。
如前所述,首先創建apple
,然後創建banana
。您可以瞭解爲什麼這發生在java language specification,Chapter 12. Execution:
你給了明確Baz
是父類和Foo
是擴大Baz
。所以當這個類初始化時,父類變量將初始化。這也是apple
是靜態變量。
何時靜態變量將在實例變量之前被初始化。如果這些沒有被初始化,它將作爲int的默認值爲'0'。
你是不是指蘋果是一個靜態變量而不是一個實例變量,或者不是? – 2012-07-10 17:26:26
這個規格很清楚。 – Scorpion 2012-07-10 18:08:14