Class A
calls the public method f()
in the Constructor. Class B overrides method f()
with its own implementation.
Suppose you inta
Whenever you create an instance of the subclass, the super classes constructor is invoked first (implicit super()
). So it prints
a: constructor
f()
is invoked next and since subclass overrides the superclass method, the subclass f()
is invoked. So you will see
B: f()
Now, the subclass is not initialized yet (still super() is executing) so x
default's to the value 0
because that is the default value for type int
. Because you incremented it (this.x++;
) it becomes 1
B: x = 1
Now, the superclass constructor is complete and resumes at the subclasses constructor and hence
B: constructor
The instance variables are now set to the values you have specified (against the default values that correspondt to the type (0
for numerics, false
for boolean
and null
for references))
NOTE: If you now print the value of x
on the newly created object, it will be 10
Since this is a bad practice, the static code analysis tools (PMD, FIndBugs etc) warn you if you try to do this.