Wednesday, December 3, 2014

Keynote: Initialization Order flow

You can provide an initial value for a field in its declaration. However it's not always a mandatory to do so. It is only necessary that fields should be declared and initialized before they are used.

Initialization order flow

  • Static initializer blocks in their declaration order.
    Note: static initializer block gets run, when the class is accessed at first timeWhich means that for 2nd class instance, static initializer block won't be invoked.
  • Instance initializer blocks in their declaration order.
    Note: non-static initializer block gets run right before class Constructor
  • Class Constructor.
    Note: super class Constructor is called right before the class Constructor.
    Which means that super class non-static initializer blocks will be invoked  before super class constructor as well.

    At this moment we think "Give me a code:)":
Java
public class InitOrderProof extends BaseOrderProof {

    public InitOrderProof() { System.out.println("class Constructor "); }

    { System.out.println("Instance initializer"); }

    public static void main(String[] args) {
          System.out.println("App Main");
          new InitOrderProof().go();
    }

    void go() { System.out.println("Instance method"); }

    static { System.out.println("1st Static initializer"); }
    static { System.out.println("2nd Static initializer"); }
}

class BaseOrderProof {

    static { System.out.println("\tsuper. Static initializer"); }

    { System.out.println("\tsuper. Instance initializer"); }

    BaseOrderProof() {
        System.out.println("\tsuper. class Constructor");
    }
}

So, what will be in output?...
Markup
super. Static initializer
1st Static initializer
2nd Static initializer
App Main
    super. Instance initializer
    super. class Constructor
Instance initializer
class Constructor
Instance method

No comments:

Post a Comment