4

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?

1
  • What I can see, Code executed serially and that is how it should be. Commented Jul 23, 2014 at 8:47

3 Answers 3

5

This is the order of initialization

  1. Set fields to default initial values (0, false, null)
  2. Call the constructor for the object (but don't execute the body of the constructor yet)
  3. Invoke the constructor of the superclass
  4. Initialize fields using initializers and initialization blocks
  5. 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.

Sign up to request clarification or add additional context in comments.

3 Comments

I still have 1 doubt. Why did 'a' compile when surely 'a' hasn't been declared when it is set in the instance block
@ShashankAgarwal : I don't understand your question
@ShashankAgarwal - 'a' is compiled properly because when constructor is called, the instance variable are set to default values in the step 1 itself. See the "accepted answer" ordering. 'a' is set to 0 , then to 20 and then to 158 in example 1
1

Order matters.

Initialization's and static blocks executes based on the order they placed in source code. That's the reason.

Comments

1

Static blocks are executed in the order they are declared in code. This article will help you understand the order of execution of static and non static initlaization blocks

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.