因此,在理解该类中显示的示例时遇到了一些麻烦-它应该说明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的静态类型,即段。因此,打印“骑士无聊”。这是正确的输出,但是我的推理正确吗?
通话2:p2.capture(p1)
使用相同的推理,从p2中调用捕获方法。通过动态类型查找,可以看到p2的动态类型是Knight。因此,它看起来在Knight子类中。 p1作为参数传递。要查看要调用的捕获方法,它查看p1的静态类型,即Knight。因此,将打印“TOO SLOW BUDDY”。显然,我的推理是错误的,因为这并不是真正的印刷内容。有方向吗?
谢谢!
最佳答案
在第二个调用中,您只能调用Piece类的方法或其子类中的相同方法。这就是为什么它将调用capture(Piece p)而不是capture(Knight k)的原因。后者特定于骑士职业。
例如,当我们有“List a = new Arraylist();”时,您只能调用在List中声明的方法,而不能调用ArrayList中其他但外观相似的方法。