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