Java 解释classloader如何加载静态变量
好的,这是一个关于java的新手问题,但我似乎无法理解它 我的类中有以下代码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},
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();