gpt4 book ai didi

Java协变返回类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:18 25 4
gpt4 key购买 nike

为什么下面的代码打印“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com