所以我在理解这个在课堂上展示的例子时遇到了一些麻烦——它应该说明 Java 中静态和动态类型之间的微妙之处。
public class Piece {
public static void main (String[] args) {
Piece p2 = new Knight();
Knight p1 = new Knight();
p1.capture(p2); // call 1; "Knight is bored" is supposed to be printed
p2.capture(p1); // call 2; "knight is bored" is supposed to be printed
}
public void capture () {
System.out.println("Capturing");
}
public void capture (Piece p) {
System.out.println("I'm bored")
}
public class Knight extends Piece {
public void capture (Piece p) {
System.out.println("Knight is bored");
}
public void capture (Knight k) {
System.out.println("TOO SLOW BUDDY");
}
}
以下是我对拨打这两个电话时发生的情况的理解:
调用 1:p1.capture(p2)
从 p1 调用捕获方法。通过动态类型查找,它看到 p1 的动态类型是Knight。所以它看起来在 Knight 子类中。p2 作为参数传入。要查看在 Knight 子类中调用哪个捕获方法,它会检查 p2 的静态类型,即piece。因此,打印了“Knight is Bored”。这是正确的输出,但我的推理是否正确?
调用 2:p2.capture(p1)
使用相同的推理,从 p2 调用捕获方法。通过动态类型查找,它看到 p2 的动态类型是Knight。所以它看起来在 Knight 子类中。p1 作为参数传入。要查看调用哪个捕获方法,它会查看 p1 的静态类型,即Knight。因此,打印“TOO SLOW BUDDY”。显然,我的推理是错误的,因为这不是真正印出来的。有什么方向吗?
谢谢!