我想问为什么java在非静态对象之前初始化静态对象?
在这个例子中,b3将在b4和b5之后初始化:
class Cupboard {
Bowl b3 = new Bowl(3);
static Bowl b4 = new Bowl(4);
Cupboard() {}
static Bowl b5 = new Bowl(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支持元类,则在声明它们时将从元类实例化类,并且即使没有这些类的实例,也可以访问它们的静态成员。所以你真的需要在非静态之前拥有静态成员。