,如果我有以下情形:实例变量建立在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