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 time. Which 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