Java中的初始化顺序

时间:2010-04-16 12:17:38

标签: java

我想问为什么java在非静态对象之前初始化静态对象?
在这个例子中,b3将在b4和b5之后初始化:

class Cupboard { 
    Bowl b3 = new Bowl(3); 
    static Bowl b4 = new Bowl(4); 
    Cupboard() {}
    static Bowl b5 = new Bowl(5); 
}

5 个答案:

答案 0 :(得分:17)

因为类的静态成员是在创建类的任何实例之前创建并初始化(在类加载期间) - 所以可以在不创建类的实例的情况下访问它们。非静态成员是按实例创建的,因此要等到创建实例以便为该实例初始化。

答案 1 :(得分:3)

因为类是在实例之前初始化的。加载类时,Java会运行任何静态块并初始化静态变量。但是,在创建实例之前,不会创建或初始化非静态实例变量。

答案 2 :(得分:2)

  • static变量在加载类时初始化。

  • 在构造此类的对象之后初始化实例变量(非静态),这是在加载类之后。

答案 3 :(得分:2)

加载类时会初始化静态变量。

构造实例时初始化实例变量。大多数情况下,这是在完全初始化类之后,但与其他人编写的内容相反,这也可能在初始化静态变量时发生。例如,对于常用的类实例,常常有静态常量,如下所示:

class Foo
{
    private static final Foo FOO_BAR = new Foo("bar");
    private static final Foo FOO_BAZ = new Foo("baz");

    private final String name;

    public Foo(String n)
    {
        name = n;
    }

    [...]
}

在FOO_BAZ初始化之前,第一个实例中的名称初始化为“bar”。

答案 4 :(得分:1)

想象一下静态变量是类的变量,而不是该类的对象。这比实例高一级。如果Java支持元类,则在声明它们时将从元类实例化类,并且即使没有这些类的实例,也可以访问它们的静态成员。所以你真的需要在非静态之前拥有静态成员。