Explanation of how classloader loads static variables

前端 未结 2 1833
再見小時候
再見小時候 2020-12-17 23:05

Ok so this is a newbie question on java, but i can\'t seem to get my head around it.

I have the following code inside my class

private static final          


        
相关标签:
2条回答
  • 2020-12-17 23:52

    Yes, in short, it is linear.

    "What the compiler actually does is to internally produce a single class initialization routine that combines all the static variable initializers and all of the static initializer blocks of code, in the order that they appear in the class declaration. This single initialization procedure is run automatically, one time only, when the class is first loaded."

    Taken from Java in a nutshell.

    http://www.developer.com/java/other/article.php/2238491

    You should define the variables and then initialize them in a static intitializer block in the correct order, or you could swap the order of the statements as follows:

    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(); 
    
    0 讨论(0)
  • 2020-12-17 23:55

    The JVM will, indeed, initialize the static fields in the order it encounters them.

    A class's static fields are initialized when the class is first encountered by the JVM. According to Java Puzzlers, puzzle 49 (which goes on to reference JLS 4.12.5), static fields are first set to their default values. Object variables are set to null, ints are set to 0, etc. After that, their initializers are executed in order of appearance.

    So, in your example, LIST_CODE and LIST_INTEGER are first set to null. Then, LIST_CODE is initialized by calling gerarListCode(). LIST_INTEGER is still null when that method is executed. Only after that, LIST_INTEGER is initialized with the literal value you give in your example.

    0 讨论(0)
提交回复
热议问题