Well, Mag, you saw what I wanted you to see. The fact that j is still 0 when you call the method "method()" is important. You see, initialization hasn't yet reached the line that says "int j = 2;". Therefore, when you invoke method(), j has a value of 0 (it's initial default value).
Remember, member initialization is done in order from top down. Therefore, i gets initialized (which calls method()) and then, after method() has been called, j is initialized.
The reason this compiles is because the compiler doesn't look inside method() to see if there are any forward references. It'll only look to see if you're trying to directly assign a value that hasn't been initialized yet to a variable. That's why your initial code failed to compile.
Order of initialization can be tricky, but it's also quite important and it's most definitely open game on the exam. Check out the JLS,
§12.4 Initialization of Classes and Interfaces for all sorts of nit-picky details.
I hope that helps,
Corey