1

It's a Interview Question, manually write the output of code below:

public class StaticTest {

    public static int k = 0;
    public static StaticTest t1 = new StaticTest("t1");
    public static StaticTest t2 = new StaticTest("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");

    {
        print("Constructor Block");
    }

    static {
        print("Static Block");
    }

    public StaticTest(String str) {
        System.out.println((++k)+":"+str+" i="+i+" n="+n);
        ++n;
        ++i;
    }
    public static int print(String str) {
        System.out.println((++k)+":"+str+" i="+i+" n="+n);
        ++i;
        return ++n;
    }

    public static void main(String[] args) {
        StaticTest t = new StaticTest("init");
    }

}

Output:

1:j i=0 n=0
2:Constructor Block i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:Constructor Block i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:Static Block i=7 n=99
9:j i=8 n=100
10:Constructor Block i=9 n=101
11:init i=10 n=102

Very Confused why execute print first, which even starts with j? I think static field and blocks are executed when class loading, so at least it should execute public static int i = print("i"); before public int j = print("j");.

Timothy Wu
  • 11
  • 1
  • Refer this for a better understanding https://stackoverflow.com/questions/19561332/in-what-order-do-static-blocks-and-initialization-blocks-execute-when-using-inhe – Sarangan Apr 28 '20 at 04:40

1 Answers1

0

JVM executes static blocks before the main method at the time loading a class. And static block will execute only once when class gets loaded. But Instance Initialization blocks and Constructor will run every time object of a Class gets created.

Static initialization blocks are static and hence they belong to a particular class and not to the instances of class.Instance initialization blocks do not belong to a class and they are executed every time a new instance of the class is created.

When we execute above class, StaticTest class is loaded into JVM.

First thing it does is, executing all static blocks even before main() method gets executed .Thus the first 8 lines of your output will be executed even before your main method is triggered.

In the order of existence public static StaticTest t1 = new StaticTest("t1") will be executed after public static int k = 0.

As there is a new instance initialization,

  • Line 1 indicates the execution of public int j = print("j")
  • Line 2 indicates the execution of print("Constructor Block")
  • Line 3 indicates the execution of constructor StaticTest("t1") when creating object.

Instance Initialization blocks are executed whenever the class is initialized and before constructors are invoked . Thus print("Constructor Block") executed before the constructor. And print("j") precedes everything.

Like the above scenario public static StaticTest t2 = new StaticTest("t2") also follows the same execution flow which correspond to Line 4,5, and 6. Then public static int i = print("i") which correspond to Line and 8.

  • Line 9 indicates the execution of public int j = print("j")
  • Line 10 indicates the execution of print("Constructor Block")
  • Line 11 indicates the execution of constructor StaticTest("init") when creating object.
Sarangan
  • 868
  • 1
  • 8
  • 24
  • 'Instance Initialization blocks are executed whenever the class is initialized': No. The class is intialized once. Instance init blocks are executed whenever an instance is constructed, and not 'before the constructor` but *during* the constructor invocation, after it calls `super()`. – user207421 Apr 28 '20 at 07:08