2012-07-10 32 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'。