这将是第一次加载静态变量或静态块? [重复](Which will be loaded firs

2019-07-21 16:20发布

这个问题已经在这里有一个答案:

  • Java的:在什么样的顺序是静态最终字段初始化? 5个回答

我的一个朋友问我,这将首先加载静态变量或静态块。

我的回答指向静态变量。

于是,他给了我两个方程,说他们之间的区别
首先,应用等式

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

我试图反编译的字节代码,发现这是同为上述两个公式。 请帮我区分它们。 我很困惑,当静态变量初始化会。

Answer 1:

静态块初始化它们出现在源文件中的顺序。 有关于这个堆栈溢出已经有几个问题......这其中有给你一个很好的答案: Java的:在什么样的顺序是静态最终字段初始化?



Answer 2:

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

这里第一O / P:0 90如在System.out.println(Some.x); 静态变量初始化语句之后执行的静块的声明static int x=90;



Answer 3:

当JVM加载类的静态变量被执行,并且所述类被加载或者当其被实例化或它的静态方法被调用。

类被实例化之前的静态初始化代码块被初始化或之前被称为它的静态方法,且用于它的静态变量即使之前。



Answer 4:

我给了静态和实例东西的控制流程的简单的例子:

假设你有2个clases A和B类延伸到B类和B类有一个main方法。 双方你在cmd命令就像编译成功后:

java B

现在什么会发生走一步看一步:

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

  9. 那么所有实例成员初始化和实例块的执行将在B级完成

  10. 和之后的B类(你用于创建对象)的构造将被执行

注:静态成员和块执行完成后只有一次,而加载类的第一次,而实例成员和实例块为我们营造了一个类的对象,每次执行。 请让我知道,如果我是不正确的。



文章来源: Which will be loaded first static variable or static block? [duplicate]