2010-04-16 73 views
5

我想问为什么java在非静态对象之前初始化静态对象?在Java中初始化的顺序

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

回答

17

因为曾经创建类的任何实例之前被创建和初始化(类加载过程中)一类的静态成员 - 他们可以访问:在这个例子B3
会后,B4和B5进行初始化而无需创建类的实例。非静态成员是按每个实例创建的,因此等待直到为该实例创建了一个要初始化的实例。

+0

+1正准备发布相同的东西。 – mikej 2010-04-16 12:21:15

+0

谢谢戴维,但是当“班加载”发生时呢?编译完成后还是想从课堂上创建实例? – 2010-04-16 12:38:23

+0

@ M.H:您的类在您第一次尝试使用它时运行时加载,或者您明确告诉VM加载它。那时候静态的东西被初始化了。如果可以在编译时确定某些值,则编译器可能已将其内联。 – 2010-04-16 13:05:24

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

  • 实例变量(非静态)在构造该类的一个对象之后进行初始化,该类是在加载该类之后进行的。

3

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

1

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

2

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

实例变量在构造实例时被初始化。大多数情况下,这是在类完全初始化之后,但与其他人所写的相反,初始化静态变量时可能会发生这种情况。例如,它是很常见的静态常量一类常用的情况下,像这样:FOO_BAZ初始化之前一审

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; 
    } 

    [...] 
} 

这名被初始化为“栏”。