gpt4 book ai didi

java - 试图理解 Java 中两个多态命令之间的区别

转载 作者:行者123 更新时间:2023-11-30 08:50:10 25 4
gpt4 key购买 nike

我有这两个类:

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

这些是我的 main 程序中的两行:

System.out.println(new B(5));
System.out.println((new B(5)).equals(new A(5)));

我知道在 Java 中调用的方法是由 Object 类型决定的,在这两行中,对象都是 B 类型,所以在第一行中,我调用了 BtoString() 方法,打印“B:”后,它调用 AtoString(),现在它尝试激活 equals() 方法。根据我对 Java 中多态性的理解,对象类型仍然是 B,因此它将尝试激活 Bequals() 方法,但是实际上,在调试时它会激活 Aequals(),这是我不明白的第一件事。

稍后在我的 main 程序的第 2 行,我正在初始化一个 B 对象,并调用 equals() 方法,所以在我看到第一行代码的行为后,我说好吧,我将调用 A equals() 但实际上这一行转到 B等于...

我有点困惑,首先,我的 main 程序的两行行为与我所知道的多态代码的工作方式不同,而且这两行行为不同,尽管它们应该行为相同。 ..

希望您能启发我了解这段代码的工作原理和原因。

最佳答案

您在 B 中的 equals() 方法不会覆盖 A 中的 equals() 方法。一个将对象作为参数,另一个将 A 作为参数。

编译 A.toString() 时,编译器会在 A 及其所有父类(super class)中查找名为 equals() 的方法,并将其任何父类(super class)/接口(interface)的 A 作为参数。并且唯一存在的是 A.equals(Object)。这就是 toString() 使用的。

多态性允许在运行时根据调用方法的对象的类型选择合适的方法。不在方法参数的类型上。如果一个方法被重载(即存在多个名称相同但参数类型不同的方法),则在编译时静态地选择要使用的方法。

关于java - 试图理解 Java 中两个多态命令之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31111763/

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