私は SCJP (最近、Oracle によって OCPJP としてブランド変更されました) の準備をしていますが、模擬試験で間違った特定の問題の 1 つが私を混乱させました。回答の説明では物事が十分に明確に説明されていません。
これは質問です:
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();
}
}
答えは です5
が、私は を選び6
ました。
オーバーライドは変数ではなく実行時のメソッドに適用されることを理解していますが、私の心がそれを解釈した方法は次のprintln
とおりです。
- c1 で getObject を呼び出す
- c1 は実際には
SubCovariantTest
オブジェクトであり、 に対して有効なオーバーライドがgetObject()
あるため、オーバーライドされたメソッドを使用します - オーバーライドは B を返すので、6 である B から x を取得します。
JVMがその部分を無視し、コンパイル時に変数が関連付けられているためgetObject()
、常に取得x
する場合ですか?c1