Java 解释classloader如何加载静态变量

Java 解释classloader如何加载静态变量,java,static,classloader,Java,Static,Classloader,好的,这是一个关于java的新手问题,但我似乎无法理解它 我的类中有以下代码 private static final String [] LIST_CODE = gerarListCode(); private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103}, {947,958}, {110,120}, {947,954}, {103,107},

好的,这是一个关于java的新手问题,但我似乎无法理解它

我的类中有以下代码

private static final String [] LIST_CODE = gerarListCode();
private static final int [][] LIST_INTEGER = new int [][] {
        {947,947}, {110,103}, 
        {947,958}, {110,120}, 
        {947,954}, {103,107}, 
        {947,967}, {110,99,104}};

 private static String [] gerarListCode()
    {
        String [] listCode = new String [LIST_INTEGER.length];

        for (int i=0 ; i<LIST_INTEGER.length ; i++)
        {
           //do some stuff      
        }

        return listaUnicode;
    }
此时变量列表_整数似乎为空


有人能解释一下原因吗?类加载器进程是线性的吗?换句话说,它在完全加载所有其他变量之前是否调用了该方法?

JVM确实会按照遇到静态字段的顺序初始化它们

类的静态字段在JVM首次遇到该类时初始化。根据拼图49(继续参考JLS 4.12.5),静态字段首先设置为其默认值。对象变量被设置为
null
int
s被设置为0等。之后,它们的初始值设定项按出现顺序执行


因此,在您的示例中,
LIST\u code
LIST\u INTEGER
首先设置为
null
。然后,通过调用
gerarListCode()
初始化
LIST\u code
<当执行该方法时,code>LIST_INTEGER仍为
null
。只有在这之后,
LIST\u INTEGER
才会用您在示例中给出的文本值初始化。

是的,简而言之,它是线性的

“编译器实际上做的是 内部生成单个类 结合 所有静态变量初始值设定项 还有所有的静态初始化器 代码块,按它们的顺序排列 出现在类声明中。此 运行单个初始化过程 自动,仅一次,当 类是首先加载的。”

简而言之,摘自Java

您应该定义变量,然后在静态初始化程序块中以正确的顺序初始化它们,或者您可以按如下方式交换语句的顺序:

private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103}, 
        {947,958}, {110,120}, 
        {947,954}, {103,107}, 
        {947,967}, {110,99,104}};

private static final String [] LIST_CODE = gerarListCode(); 

将LIST_INTEGER的声明移到LIST_code之前的一行,这与类装入器无关。它是由javac按照源代码的顺序创建静态初始化器来实现的。严格来说,不是在加载类时,而是在稍后初始化类时。
private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103}, 
        {947,958}, {110,120}, 
        {947,954}, {103,107}, 
        {947,967}, {110,99,104}};

private static final String [] LIST_CODE = gerarListCode();