Search code examples
javabraces

Strange behavior using braces in Java


When I run the following code:

public class Test {

  Test(){
    System.out.println("1");
  }

  {
    System.out.println("2");
  }

  static {
    System.out.println("3");
  }

  public static void main(String args[]) {
    new Test();
  }
}

I expect to get the output in this order:

1
2
3

but what I got is in reverse order:

3
2
1

Can anyone explain why it is output in reverse order?

================

Also, when I create more than one instance of Test:

new Test();
new Test();
new Test();
new Test();

static block is executed only at first time.


Solution

  • It all depends on the order of execution of initialization statements. Your test demonstrates that this order is:

    1. Static initialization blocks
    2. Instance initialization blocks
    3. Constructors

    Edit

    Thanks for the comments, now I can quote the appropriate part in the JVM specification. Here it is, the detailed initialization procedure.