2

如果我有以下情况:

public class Foo extends Baz{
  private String banana = "banana";
  //blah blah blah
}


public class Baz{
  protected static String apple = "apple"; 
}

首先创建的是苹果还是香蕉?我想说苹果首先被创建,但我不确定。

4

5 回答 5

8

apple是首先创建的。它是静态的,并且在父级类中。

静态初始化程序(初始化apple变量)将在Baz加载类后立即运行,这必须在创建实例之前发生Baz

intsance 初始化程序(初始化banana变量)将在Foo创建实例后立即运行。

于 2012-07-10T17:26:45.650 回答
4

apple是一个静态变量,所以它在类初始化时被初始化。这发生可以创建实例之前 - 因此在这种特殊情况下它是在之前初始化的。 banana

如果apple是一个实例变量,它仍然会在之前被初始化banana:实例变量被初始化,就好像初始化器出现在构造函数体的开头,但是任何链接到超类构造函数之后。(如果您感兴趣,这与 C# 不同,其中实例变量初始化程序在构造函数链接之前执行。)

于 2012-07-10T17:27:45.367 回答
2

要创建一个类的实例,您需要加载和初始化这个类,所以很明显,静态字段将在第一个实例字段初始化之前被初始化。

于 2012-07-10T17:28:12.233 回答
0

您已经清楚地给出Baz了父类并且Foo正在扩展Baz. 因此,当类初始化时,父类变量将初始化。那也是apple静态变量。

何时静态变量将在实例变量之前初始化。如果那些没有被初始化,它将把 int 的默认值设为 '0'。

于 2012-07-11T14:08:31.567 回答
0

如前所述,apple先创建后banana创建。您可以在java 语言规范第12 章中了解为什么会出现这种情况。执行

于 2012-07-10T17:35:14.953 回答