Q:

Java Instance Initialization Block and instance variables

In context to my previous question Java classes and static blocks what if I changed my code from static block and variables to normal Instance Initialization Block and instance variables. Now how would the code be executed?
class extra3 {
    public static void main(String string[]) {
        Hello123 h = new Hello123();
        System.out.println(h.a);
    }
}
class Hello123 {
    {
        a=20;
    }
    int a=158;
}

Here I am getting output as 158. I am not able to understand the reason here.And the other code being this:
class extra3 {
    public static void main(String string[]) {
        Hello123 h = new Hello123();
        System.out.println(h.a);
    }
}
class Hello123 {
    int a=158;
    {
        a=20;
    }
}

Here the output is 20 which is acceptable because when object is created Instance block is executed first. But why is the output in first code coming as 158?

A:

This is the order of initialization

Set fields to default initial values (0, false, null)
Call the constructor for the object (but don't execute the body of the constructor yet)
Invoke the constructor of the superclass
Initialize fields using initializers and initialization blocks
Execute the body of the constructor

So, when you are initializing fields, both inline initializer (a = 158) and initialization blocks (a = 20) are executed in the order as they have defined.
So in the first case, inline initializer executed after the initialization block, you get 158 as result.
In the second case, initialization block got executed after inline initializer.

