java中的实例变量创建

时间:2012-07-10 17:23:52

标签: java inheritance hierarchy instance-variables

如果我有以下情况:

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


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

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

5 个答案:

答案 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 specificationChapter 12. Execution

中了解这种情况

答案 4 :(得分:0)

您已明确指出Baz是父类,Foo正在扩展Baz。因此,当类初始化时,父类变量将初始化。 apple也是静态变量。

何时静态变量将在实例变量之前初始化。如果那些未初始化,则将int的默认值视为'0'。