在Java静态变量的初始化顺序(Order of initialization of static

2019-10-17 17:31发布

我有两个不同的文件两班,每一个都有一个静态变量,我想知道是否有预测哪些人会首先初始化的方式(是实现相关的)? 我的代码看起来是这样的?

File1:
public class A
{
  public static boolean a = Logger.log();
}

File2:
public class B
{
  public static boolean b = Logger.log();
}

File3:
public class Logger
{
  public static boolean log();
}

Answer 1:

这取决于当第一次使用每个类上。

从Java语言规范的第12.4.1 :

类或接口类型T将紧接在以下中的任何一个的第一次出现之前被初始化:

  • T是一个类并且创建T的实例。

  • T是一类由T中声明静态方法被调用。

  • 由T中声明静态字段分配。

  • 由T中声明的静态字段用于和场不是一个常数变量(§4.12.4)。

  • T是顶层类(第7.6节),和(§8.1.3)被执行断言语句(§14.10)词法嵌套T内。

静态字段(§8.3.1.1)的引用仅引起类或实际声明它接口的初始化阶段,即使它可能是通过一个子类,子接口,或实现接口的类的名字被提及。

12.4.2节的JLS的指定详细的初始化程序。

说实话,如果你的代码需要一个人在另一个之前,尽管有没有明显的相关性进行初始化,然后你有问题,反正。



Answer 2:

根据你的榜样 - 没有办法了Aa前初始化了Bb因为B级的访问将首先调用它的晚饭类的静态初始化。

如果你真的需要B之前做的一个逻辑 - 尝试封装它的静态方法:

public class A
{
  public static boolean a;
  public static init() {
   a = log();
  }
}

public class B
{
  public static boolean b;
  public static init() {
   b = log();
  }
}

public class Main
{
  public static void main(String[] args) {
   B.init();       
   A.init();      
  }
}


Answer 3:

JVM没有跟上它的所有类,但是当请求类或类的静态成员,它加载从内存类的记录。 所以这之后的实际过程是这样的:

当类请求第一次:

  1. 所有静态变量

  2. 静态块(由顺序,第一个第一然后第二等)

  3. 实例变量(会员)

  4. 初始化器块(由顺序)

  5. 构造函数

而第二或算账:

  1. 所有的实例变量(会员)

  2. 初始化语句块(由令)

  3. 构造函数。

我希望这能帮到您。

谢谢...

Mr.777



文章来源: Order of initialization of static variable in Java
标签: java static