如果我有以下情况:
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
首先创建的是苹果还是香蕉?我想说苹果首先被创建,但我不确定。
如果我有以下情况:
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
首先创建的是苹果还是香蕉?我想说苹果首先被创建,但我不确定。
apple
是首先创建的。它是静态的,并且在父级类中。
静态初始化程序(初始化apple
变量)将在Baz
加载类后立即运行,这必须在创建实例之前发生Baz
。
intsance 初始化程序(初始化banana
变量)将在Foo
创建实例后立即运行。
apple
是一个静态变量,所以它在类初始化时被初始化。这发生在可以创建实例之前 - 因此在这种特殊情况下它是在之前初始化的。 banana
如果apple
是一个实例变量,它仍然会在之前被初始化banana
:实例变量被初始化,就好像初始化器出现在构造函数体的开头,但是在任何链接到超类构造函数之后。(如果您感兴趣,这与 C# 不同,其中实例变量初始化程序在构造函数链接之前执行。)
要创建一个类的实例,您需要加载和初始化这个类,所以很明显,静态字段将在第一个实例字段初始化之前被初始化。
您已经清楚地给出Baz
了父类并且Foo
正在扩展Baz
. 因此,当类初始化时,父类变量将初始化。那也是apple
静态变量。
何时静态变量将在实例变量之前初始化。如果那些没有被初始化,它将把 int 的默认值设为 '0'。
如前所述,apple
先创建后banana
创建。您可以在java 语言规范第12 章中了解为什么会出现这种情况。执行: