如果我有以下情况:
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 章中了解为什么会出现这种情况。执行: