【发布时间】:2012-09-25 18:50:04
【问题描述】:
我正在准备 SCJP(最近被 Oracle 重新命名为 OCPJP),我在模拟考试中做错的一个特定问题让我感到困惑,答案描述并没有足够清楚地解释事情。
这是个问题:
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,所以从 B 中抓取 x,即 6
这是 JVM 忽略 getObject() 部分,并且总是从 c1 中获取 x 作为变量在编译时关联的情况吗?
【问题讨论】:
-
输入代码后,为什么不运行它并看到它返回 5?
-
我也看到它会返回 5 而不是 6!!
标签: java overriding scjp ocpjp