【发布时间】:2015-06-29 09:08:28
【问题描述】:
我有这两个类:
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 类型,所以在第一行中我调用了B 类toString() 方法,
从那里打印“B:”之后,它调用A 类toString(),现在它尝试激活equals() 方法。
根据我对Java中多态性的理解,对象类型我仍然是B,所以它会尝试激活B的equals()方法,但实际上在调试时它会激活A类equals(),这是第一个我不明白的事情。
稍后在我的main 程序的第二行中,我正在初始化一个B 对象,并调用equals() 方法,所以在我看到第一行代码的行为之后,我说好吧,我会打电话给Aequals(),但实际上这条线转到B的equals...
我有点困惑,首先我的 main 程序的 2 行的行为与我所知道的多态代码的工作方式不同,并且 2 行的行为不同,尽管它们的行为应该相同......
希望你能告诉我这段代码是如何工作的以及为什么。
【问题讨论】:
-
equals(A o)不会覆盖equals(Object o)。 -
@biziclop 我想过,但是这两行如何调用不同的
equals()方法?
标签: java methods polymorphism equals tostring