java 协变返回类型

发布于 2024-11-09 20:08:42 字数 547 浏览 2 评论 0 原文

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

Why does below code prints "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);
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流绪微梦 2024-11-16 20:08:42

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

您要问的是,类 A 中定义的字段 x 的值(因为 Base.getObject() 返回 A)。即使 CovariantReturn 重写返回 B 的方法,您也不会将您的对象引用为 CovariantReturn

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

Because you are referring to fields, which are not affected by polymorphism. If you instead used getX(), it would've returned 2.

What you are asking is, the value of field x defined in class A (because Base.getObject() returns A). Even though CovariantReturn overrides the method to return B, you are not referring to your object as CovariantReturn.

To expand a bit on how fields are not affected by polymorphism - field access is realized at compile time, so whatever the compiler sees, that's what's accessed. In your case the method defines to return A and so A.x is accessed. On the other hands methods are invoked based on the runtime type. So even if you define to return A but return an instance of B, the method you invoke will be invoked on B.

划一舟意中人 2024-11-16 20:08:42

@kris979虽然你返回B,但我认为区别在于返回类型是A。因此打印A中x的值,即1。

@kris979 Though you are returning B, i think what makes the difference is that the return type is of A. Hence value of x in A i.e. 1 is printed.

过期以后 2024-11-16 20:08: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);
    }
}

此代码将打印 - in sub and 1

As Bozho pointed out - instance variable are never affected by polymorphism. Let me give you a quick small example.

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);
    }
}

This code will print - in sub and 1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文