I'm preparing for the SCJP (recently rebranded as OCPJP by Oracle) and one particular question that I got wrong on a mock exam has confused me, the answer description doesn't explain things clear enough.
This is the question :
class A
{
int x = 5;
}
class B extends A
{
int x = 6;
}
public class CovariantTest
{
public A getObject()
{
return new A();
}
public static void main(String[]args)
{
CovariantTest c1 = new SubCovariantTest();
System.out.println(c1.getObject().x);
}
}
class SubCovariantTest extends CovariantTest
{
public B getObject()
{
return new B();
}
}
The answer is 5
, but I chose 6
.
I understand that overriding applies to methods at runtime, and not variables, but the way my mind interpreted that println
was :
- call getObject on c1
- c1 is actually a
SubCovariantTest
object, and has a valid override forgetObject()
, so use the overridden method - The override returns B, so grab x from B which is 6
Is it a case of the JVM ignoring the getObject()
part, and always taking x
from c1
as variables are associated at compile time?