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:)":

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?...
    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