为什么下面的代码打印"1“?
class A {
int x = 1;
}
class B extends A {
int x = 2;
}
class Base {
A getObject() {
System.out.println("Base");
return new B();
}
}
public class CovariantReturn extends Base {
B getObject() {
System.out.println("CovariantReturn");
return new B();
}
/**
* @param args
*/
public static void main(String[] args) {
Base test = new CovariantReturn();
System.out.println(test.getObject() instanceof B);
System.out.println(test.getObject().x);
}
}发布于 2011-05-26 18:39:29
因为您引用的是不受多态性影响的字段。如果您使用的是getX(),它将返回2。
您所询问的是类A中定义的字段x的值(因为Base.getObject()返回A)。即使CovariantReturn覆盖了返回B的方法,您也没有将对象引用为CovariantReturn。
稍微扩展一下字段是如何不受多态性影响的--字段访问是在编译时实现的,所以无论编译器看到什么,这就是所访问的内容。在本例中,该方法定义为返回A,因此将访问A.x。另一方面,方法是基于运行时类型调用的。因此,即使您定义返回A但返回B的一个实例,您调用的方法也会在B上被调用。
发布于 2011-05-26 18:47:11
@kris979虽然你返回的是B,但我认为不同之处在于返回的类型是A。因此,A中x的值也就是1被打印出来。
发布于 2013-01-09 03:16:42
正如Bozho指出的那样-实例变量永远不会受到多态性的影响。让我给你举一个简单的小例子。
class Base {
int i = 1;
void method() {
System.out.println("in base");
}
}
class Sub extends Base {
int i = 2;
void method() {
System.out.println("in sub");
}
}
public class Test {
public static void main(String[] args) {
Base obj = new Sub();
obj.method();
System.out.println(obj.i);
}
}此代码将在sub和1中打印-
https://stackoverflow.com/questions/6137189
复制相似问题