The first piece of code doesnt create any objects of the class hence the constructor is not called. This way only 'hello' would be printed. If you modified it a little bit using instead of now when the class is initialized, execution of any class variable initializers and static initializers of the class is also done. This will result in 'hai' printed first followed by 'hello'.

when u say new Test() the constructor gets invoked. It should print "hai" why it's not happen in this case.

When a class is loaded it first initialise the static variable the executes static block. then the execution starts from main().

In your code Test tst=new Test(); is a instance variable not a static or class variable.So, its not been initialised.Once you create an object of this class in the main() method then only all inatance variable will be initialise. But in this case its not possible as already explained by Mani vannan.