All instance variables will initially take on their default values (0 for int variables) when they're created. If you provided any of the instance variables with initializer expressions/values, the variables will then be initialized in the order that you wrote them in your code (along with any initializer blocks).
So basically what happens in this program is that when the initializer in "i = giveMeJ();" is processed, the "j = 10" line hasn't been processed yet. So j still has its default value (i.e. 0) at the time of the giveMeJ() method call.
If you reverse the order of your i and j declarations, you'll get the output you expect. In other words: will produce the output "10".
I'm not sure if I approve of this interruption. But this tiny ad checks out: