哪个会加载第一个静态变量或静态块?

时间:2013-03-15 08:28:52

标签: java static stack core

我的一位朋友问我哪个会加载第一个静态变量或静态块。

我的回答指向静态变量。

所以他给了我两个方程式并说要区分它们 第一个等式

public class Some {
    public static void main(String args[])
    {
        System.out.println(Some.x);
    }
    static {
        System.out.println(Some.x);
    }
    static int x=90;
}

O / P:0 90

第二个等式

public class Some {
    public static void main(String args[])
    {
        System.out.println(Some.x);
    }
    static int x=90;
    static {
        System.out.println(Some.x);
    }
}

O / P:90 90

我试图对字节代码进行反编译,发现它对于上述两个方程都是相同的。 请帮我区分它们。 当静态变量初始化时我很困惑。

4 个答案:

答案 0 :(得分:6)

静态块按照它们在源文件中出现的顺序进行初始化。 关于堆栈溢出有几个问题已经存在...... 这个有一个很好的答案:Java : in what order are static final fields initialized?

答案 1 :(得分:2)

静态变量和静态块按它们出现的顺序执行。

这里首先是O / P:0 90,就像在静态变量初始化语句System.out.println(Some.x);

之后执行的静态块的static int x=90;语句一样

答案 2 :(得分:-1)

静态变量在JVM加载Class时执行,而Class在实例化或调用静态方法时会被加载。

static Initializer Block在Class被实例化之前或者在调用静态方法之前获得Initialized,甚至在使用静态变量之前就已经初始化了。

答案 3 :(得分:-1)

我给出了一个简单的例子来说明静态和实例的控制流程:

假设您有2个A和B分支。 A类扩展到B类,B类有主方法。成功编译cmd上的命令后,就像:

java B

现在将会发生一步一步的事情:

  1. 将加载A和B类
  2. 将识别并且将会识别A类的静态成员和块 顺序执行(逐个执行)(但在类加载时只执行一次)
  3. 将识别并执行B类的静态成员和块(逐个)(但在类加载时只有一次)
  4. 将调用B类的主要方法(如果B类没有main方法,那么将调用A类的主方法)
  5. 只要您创建A类对象:所有实例 成员初始化和实例块执行将在 A级
  6. 类A的构造函数(用于创建对象)将 执行
  7. 如果您创建了B类的对象:所有实例     成员初始化和实例块执行将在     A级。
  8. 类A的构造函数(如果从B的构造函数中调用它,则为默认构造函数或任何其他构造函数)         执行

  9. 然后是所有实例         成员初始化和实例块执行将在         B级

  10. 之后是B类的构造函数(用于 创建对象)将被执行
  11. 注意:第一次加载类时,静态成员和块执行只执行一次,而每次创建类的对象时,实例成员和实例块都会执行。 如果我不对,请告诉我。