因此,在理解该类中显示的示例时遇到了一些麻烦-它应该说明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中其他但外观相似的方法。

09-13 08:07