Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order of static initialization blocks

Tags:

java

static

I found a lot of posts on static initialization blocks, however I'm trying to get a little better picture about the execution order and the reason for it. The code below prints out the text in both the static blocks and "then" prints out the text in the main static block.

I understand the way the compiler calls this is to do all the static blocks in order when the class is loaded and then access the main method. But since the main method itself is static, why not execute that in order of the other static blocks (Not even sure if its useful, just trying to understand a concept and if there's a pressing reason for it being done this way). What if there's static block we want to run after the main block?

class Cat {

    static
    {
        System.out.println("This block welcomes you first");
    }

    public static void main(String[] args)
    {
        System.out.println("Meow world ");
    }

    static
    {
        System.out.println("This block welcomes you after");
    }
}

Actual Output

This block welcomes you first
This block welcomes you after
Meow world 

Why not?

This block welcomes you first
Meow world 
This block welcomes you after
like image 893
aparna Avatar asked Dec 24 '14 05:12

aparna


People also ask

Which comes first static block or Main?

In Java static block is used to initialize the static data members. Important point to note is that static block is executed before the main method at the time of class loading.

What should be the execution order of a class has a method static block?

The execution order of the program is that the static block executes first, then instance block, and then constructor.

What is the execution order of init blocks?

Initialization blocks run in the same order in which they appear in the program. Instance Initialization blocks are executed whenever the class is initialized and before constructors are invoked. They are typically placed above the constructors within braces.

What should be the execution order if a class has a method static block initialization block and constructor?

Order of execution When you have all the three in one class, the static blocks are executed first, followed by constructors and then the instance methods.


1 Answers

Static initializers are executed as soon as the class is loaded. The main method is called after the class has been loaded.

This section of the JLS discusses the sequence of events (12.1.3-4):

12.1.3. Initialize Test: Execute Initializers

In our continuing example, the Java Virtual Machine is still trying to execute the method main of class Test. This is permitted only if the class has been initialized (§12.4.1).

Initialization consists of execution of any class variable initializers and static initializers of the class Test, in textual order. But before Test can be initialized, its direct superclass must be initialized, as well as the direct superclass of its direct superclass, and so on, recursively. In the simplest case, Test has Object as its implicit direct superclass; if class Object has not yet been initialized, then it must be initialized before Test is initialized. Class Object has no superclass, so the recursion terminates here.


12.1.4. Invoke Test.main

Finally, after completion of the initialization for class Test (during which other consequential loading, linking, and initializing may have occurred), the method main of Test is invoked.

like image 71
August Avatar answered Sep 29 '22 08:09

August