Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In what order do static/instance initializer blocks in Java run?

Say a project contains several classes, each of which has a static initializer block. In what order do those blocks run? I know that within a class, such blocks are run in the order they appear in the code. I've read that it's the same across classes, but some sample code I wrote disagrees with that. I used this code:

package pkg;  public class LoadTest {     public static void main(String[] args) {         System.out.println("START");         new Child();         System.out.println("END");     } }  class Parent extends Grandparent {     // Instance init block     {         System.out.println("instance - parent");     }      // Constructor     public Parent() {         System.out.println("constructor - parent");     }      // Static init block     static {         System.out.println("static - parent");     } }  class Grandparent {     // Static init block     static {         System.out.println("static - grandparent");     }      // Instance init block     {         System.out.println("instance - grandparent");     }      // Constructor     public Grandparent() {         System.out.println("constructor - grandparent");     } }  class Child extends Parent {     // Constructor     public Child() {         System.out.println("constructor - child");     }      // Static init block     static {         System.out.println("static - child");     }      // Instance init block     {         System.out.println("instance - child");     } } 

and got this output:

START
static - grandparent
static - parent
static - child
instance - grandparent
constructor - grandparent
instance - parent
constructor - parent
instance - child
constructor - child
END

The obvious answer from that is that parents' blocks run before their children's, but that could just be a coincidence and doesn't help if two classes aren't in the same hierarchy.

EDIT:

I modified my example code by appending this to LoadTest.java:

class IAmAClassThatIsNeverUsed {     // Constructor     public IAmAClassThatIsNeverUsed() {         System.out.println("constructor - IAACTINU");     }      // Instance init block     {         System.out.println("instance - IAACTINU");     }      // Static init block     static {         System.out.println("static - IAACTINU");     } } 

As implied by the class name, I never referenced the new class anywhere. The new program produced the same output as the old one.

like image 208
Pops Avatar asked Jan 05 '10 17:01

Pops


People also ask

Which is executed first static block or instance block?

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.

What is the order of blocks to execute?

The first block to execute has the lowest execution order, which is usually 1 . The displayed execution order may skip numbers, but the blocks always execute in order of the visible numbers.

What should be the execution order if a class has a method static block instance block and constructor in the given program?

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

What order does Java run in?

Execution order:Parent class - > subclass. Static Attribute - Static Code Block - > Common Attribute - Constructing Code Block - > Constructing Method - > Common Code Block (where method is called before execution)


2 Answers

See section 12.4 and 12.5 of the JLS version 8, they go into gory detail about all of this (12.4 for static and 12.5 for instance variables).

For static initialization (section 12.4):

A class or interface type T will be initialized immediately before the first occurrence of any one of the following:

  • T is a class and an instance of T is created.
  • T is a class and a static method declared by T is invoked.
  • A static field declared by T is assigned.
  • A static field declared by T is used and the field is not a constant variable (§4.12.4).
  • T is a top level class (§7.6), and an assert statement (§14.10) lexically nested within T (§8.1.3) is executed.

(and several weasel-word clauses)

like image 134
Keith Randall Avatar answered Sep 30 '22 08:09

Keith Randall


The static initializer for a class gets run when the class is first accessed, either to create an instance, or to access a static method or field.

So, for multiple classes, this totally depends on the code that's run to cause those classes to get loaded.

like image 20
Chris Jester-Young Avatar answered Sep 30 '22 09:09

Chris Jester-Young