When you start instantiating the object, it somewhat existed already .. it just not return yet to you. Probably the confusion is caused by the default value initialization of the atributes using giveMeJ() and value 10 for j, as it seems like they exist outside of the constructor.
As you know everytime you instantiate something, VM create the object instant and setup the attribute area first where object get null and primitive get the 0 value or false for boolean, then it call the constructor.
When you set it with your own default value, the compiler actually move them into your constructor. So the code you wrote is no difference than this:
You can see it happen in the bytecode that is generated by your code and the above code.
Thanks for such a great explanation of the concept. It is really very useful to understand. And your explanation with the bytecode is excellent. I have never thought of something like this in these terms.