作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么下面的代码打印“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);
}
}
最佳答案
因为您指的是不受多态性影响的字段。如果您改为使用 getX()
,它会返回 2
。
您要问的是 A
类中定义的字段 x
的值(因为 Base.getObject()
返回 一个
)。即使 CovariantReturn
覆盖了返回 B
的方法,您也没有将您的对象称为 CovariantReturn
。
进一步说明字段如何不受多态性影响 - 字段访问是在编译时实现的,因此编译器看到的就是所访问的。在您的情况下,该方法定义为返回 A
,因此可以访问 A.x
。另一方面,方法是根据运行时类型调用的。因此,即使您定义返回 A
但返回 B
的实例,您调用的方法也会在 B
上调用。
关于Java协变返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6137189/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!