2012-07-10 33 views
2

,如果我有以下情形:實例變量建立在Java

public class Foo extends Baz{ 
    private String banana = "banana"; 
    //blah blah blah 
} 


public class Baz{ 
    protected static String apple = "apple"; 
} 

當中去創造第一,蘋果或香蕉?我想說蘋果首先被創造出來,但我不確定。

+0

你是不是指蘋果是一個靜態變量而不是一個實例變量,或者不是? – 2012-07-10 17:26:26

+0

這個規格很清楚。 – Scorpion 2012-07-10 18:08:14

回答

8

apple首先被創建。它是靜態的,並且在父級別類中。作爲Baz類是將具有可創建的Baz實例之前發生加載

的靜態初始化(其初始化apple變量)就會立即運行。

只要創建了Foo的實例,就會運行初始化器(初始化變量banana)。

4

apple是一個靜態變量,因此它在類初始化時被初始化。在之前會出現,因此可以創建一個實例 - 因此在此特定情況下,它會在banana之前初始化爲

如果apple是一個實例變量時,它仍然會banana前初始化:彷彿初始化發生在構造函數體開始實例變量初始化,但任何鏈接到一個父類的構造之後。 (如果您有興趣,這與C#不同,其中實例變量初始值設定項在執行構造函數鏈之前執行。)

2

要創建類的實例,需要此類被加載和初始化,很顯然,靜態字段將在第一個實例字段被初始化之前被初始化。

0

你給了明確Baz是父類和Foo是擴大Baz。所以當這個類初始化時,父類變量將初始化。這也是apple是靜態變量。

何時靜態變量將在實例變量之前被初始化。如果這些沒有被初始化,它將作爲int的默認值爲'0'。