gpt4 book ai didi

java - 多态性没有按预期工作,为什么?

转载 作者:行者123 更新时间:2023-12-02 04:35:12 24 4
gpt4 key购买 nike

我的 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();
}
}

现在我主要做这两个简单的 Action :

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

关于第一行,正如我所料,它将创建一个 A 对象 -> 转到 A 的 toString函数 -> 获取True对于equals函数并最终打印“五”。

关于B,我的预期和实际发生的情况是不同的......我以为它会转到 B 的构造函数 -> 转到 A 构造函数并将数字 5 分配给 x -> 返回 B 构造函数并将数字 6 分配给 B 的 x -> 转到 B 的 toString方法并打印“B:”(到目前为止我是对的)->转到A的toString -> 转到 B 的 equals因为对象类型是 B,这就是您所看到的有关方法激活的内容(*这是我错的地方)-> return False因为x B 中是 6 -> 打印数字 5,因为我们在 A 中 toString .

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

我不知道为什么会发生这种情况,我只知道激活的方法是由对象类型决定的。

希望有人能解释一下这里有什么不同......谢谢!

最佳答案

为 future 的读者扩展您的答案:

A.toString()中,您调用this.equals( Five),其中 Five的类型为A.

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

如果有一个重写方法 B.equals(Object o) 那么就会调用该方法。仅有类型较窄的 B.equals() 方法还不够。

您可以通过提供 A.equals(A a) 方法或扩展 B.equals() 的广度来获得您期望的行为对象

一些注意事项:

  • 仅用几行代码,您就创建了一些非常复杂的东西。我希望这只是为了实验:真正的代码应该更加简单。
  • 如果您要实现 equals(),请使其接受 Object,这样您就将覆盖标准方法。

关于java - 多态性没有按预期工作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30918586/

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