首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java协变返回类型

java协变返回类型
EN

Stack Overflow用户
提问于 2011-05-26 18:36:26
回答 3查看 1.5K关注 0票数 8

为什么下面的代码打印"1“?

代码语言:javascript
复制
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);
}
}
EN

回答 3

Stack Overflow用户

发布于 2011-05-26 18:39:29

因为您引用的是不受多态性影响的字段。如果您使用的是getX(),它将返回2

您所询问的是类A中定义的字段x的值(因为Base.getObject()返回A)。即使CovariantReturn覆盖了返回B的方法,您也没有将对象引用为CovariantReturn

稍微扩展一下字段是如何不受多态性影响的--字段访问是在编译时实现的,所以无论编译器看到什么,这就是所访问的内容。在本例中,该方法定义为返回A,因此将访问A.x。另一方面,方法是基于运行时类型调用的。因此,即使您定义返回A但返回B的一个实例,您调用的方法也会在B上被调用。

票数 13
EN

Stack Overflow用户

发布于 2011-05-26 18:47:11

@kris979虽然你返回的是B,但我认为不同之处在于返回的类型是A。因此,A中x的值也就是1被打印出来。

票数 0
EN

Stack Overflow用户

发布于 2013-01-09 03:16:42

正如Bozho指出的那样-实例变量永远不会受到多态性的影响。让我给你举一个简单的小例子。

代码语言:javascript
复制
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中打印-

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6137189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档