そのため、クラスで示されたこの例を理解するのに少し苦労しています.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");
}
}
2つの呼び出しが行われたときに何が起こるかについての私の理解は次のとおりです。
呼び出し 1: p1.capture(p2)
キャプチャ メソッドは p1 から呼び出されます。動的タイプのルックアップにより、p1 の動的タイプがKnightであることがわかります。したがって、Knight サブクラスに見えます。p2 が引数として渡されます。Knight サブクラス内で呼び出すキャプチャ メソッドを確認するために、p2のstatic型であるpieceをチェックします。そのため、「Knight is Bored」がプリントされています。これは正しい出力ですが、私の推論は正しいですか?
呼び出し 2: p2.capture(p1)
同じ理由で、capture メソッドは p2 から呼び出されます。動的型ルックアップを介して、p2 の動的型がKnightであることがわかります。したがって、Knight サブクラスに見えます。p1 が引数として渡されます。呼び出すキャプチャ メソッドを確認するために、p1 の静的型であるKnightを調べます。そのため、「TOO SLOW BUDDY」がプリントされています。明らかに、それは実際に印刷されたものではないため、私の推論は間違っています。方向性は?
ありがとう!