You can find the order of initialization in some good Java Books (like K&B SCJP6).
But for the purpose of your question, just know that before your assignment of instance variables, they are set to default values (i.e. int = 0, Object = null, etc.).
The instance variables assignment itself happens in up-to-down manner, so when you start initializing x variable, the y variable is set to default value (which is 0). When the assignment of x variable is finished, the y variable will be assigned the given value.
Hope that following this you can understand the rest of the code.
Hi, have you read all about instance initializers, I think a little hint you will need to solve it yourself.
First, the main() method is called, in that the constructor of the Main class which you wrote and all superclasse's contructors are invoked within this after that instance initializers and so on...........