繁体   English   中英

多态不能按预期工作,为什么?

[英]Polymorphism doesn't work as expected, why?

我的Java程序中有以下2个类:

public class A {
    private final static A five = new A(5);
    public final int x;
    public A(int x) {
        this.x = x;
    }
    public boolean equals(Object o) {
        return x == ((A) o).x;
    }
    public String toString() {
        return equals(five) ? "five" : (x + "");
    }
}

public class B extends A {
    public final int x;
    public B(int x) {
        super(x);
        this.x = x + 1;
    }
    public boolean equals(A o) {
        return x == o.x;
    }
    public String toString() {
        return "B: " + super.toString();
    }
}

现在我主要执行以下两个简单操作:

public static void main(String[] args) {
    System.out.println(new A(5));
    System.out.println(new B(5));
}

如我所料,大约在第一行,它将创建一个A对象->转到A的toString函数->为equals函数获取True ,最后打印“五”。

关于B,我期望的和实际发生的事情是不同的...我认为它将转到B的构造函数->转到A构造函数并将数字5分配给x >返回B构造函数并将数字6分配给B的x >转到B的toString方法并打印“ B:”(直到这一点我是对的)->转到A的toString >转到B的equals因为对象类型为B,这就是您在方法激活时所关注的内容( *这是我错的地方->返回False因为B中的x是6->因为我们在A的toString中,所以打印数字5。

相反,在调用A类toString而不是转到B equals方法的部分中,它停留在A中并激活A equals ...

我不知道为什么会这样,我所知道的是激活的方法由对象类型决定。

希望有人可以向我解释一下这里有什么不同...谢谢!

为了扩大您的答案,供将来的读者使用:

A.toString()您调用this.equals(five) ,其中fiveA类型。

在A的上下文中,唯一匹配A equals()方法是A.equals(Object o) 这就是JVM调用的方法。

如果有一个覆盖方法B.equals(Object o)则将调用此方法。 B.equals()一个类型更窄的B.equals()方法是不够的。

您可以通过提供A.equals(A a)方法或扩展B.equals()的宽度以采用Object来获得预期的行为。

一些注意事项:

  • 在仅几行中,您在这里创建了一些非常复杂的东西。 我希望这只是试验:真实的代码应该简单得多。
  • 如果要实现equals()使其接受Object ,那么您将覆盖标准方法。

正如给出的注释所解释的那样,我没有重写函数,而是使用对该方法全​​新的签名重载了该函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM