如果我有以下情况:
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
首先创建哪个,苹果还是香蕉?我想说苹果首先被创造,但我不确定。
答案 0 :(得分:8)
apple
。它是静态的,并且在父级别类中。
静态初始化程序(初始化apple
变量)将在加载Baz
类后立即运行,这必须在Baz
的实例创建之前发生。< / p>
创建banana
的实例后,intsance初始化程序(初始化Foo
变量)将立即运行。
答案 1 :(得分:4)
apple
是静态变量,因此它在类初始化时初始化。这种情况发生在之前可以创建实例 - 因此在此特定情况下 banana
之前已初始化。
如果apple
是实例变量,它仍会在banana
之前初始化:初始化实例变量,好像初始化程序出现在构造函数体的开头,但之后任何链接到超类构造函数。 (如果您感兴趣,这与C#不同,其中实例变量初始值设定项在构造函数链接之前执行。)
答案 2 :(得分:2)
要创建类的实例,需要加载和初始化此类,因此显然,在初始化第一个实例字段之前,将初始化静态字段。
答案 3 :(得分:0)
如前所述,首先创建apple
,然后创建banana
。您可以在java language specification,Chapter 12. Execution:
答案 4 :(得分:0)
您已明确指出Baz
是父类,Foo
正在扩展Baz
。因此,当类初始化时,父类变量将初始化。 apple
也是静态变量。
何时静态变量将在实例变量之前初始化。如果那些未初始化,则将int的默认值视为'0'。