3

我最近才开始学习 java,所以我在理解我认为是多态性问题时遇到了一些麻烦。我正在尝试编写一个国际象棋游戏,所以我有一个超类数组,GamePiece子类PawnPiece扩展了该数组。我在两个类中都有一个方法,MovePiece()它改变了一块的位置。当我使用 时MovePiece(),会更改 的位置值PawnPiece,但是当我尝试在我的主代码中调用位置时,它给了我“GamePiece”的未更改位置。这是我的一些代码:

public class GamePiece {
    int position;

    //Constructor
    public GamePiece(int x){
       position=x;
    }
    public void MovePiece(int positionOfMove){};
}

public class PawnPiece extends GamePiece{
    int positionPawn;

    //Subclass Constructor
    public PawnPiece(int x){
        super(x);
    }

    public void MovePiece(int positionOfMovePawn){
       positionPawn=x;
}

public classChessMain{
    public static void main(String[] arg){
        GamePiece[] allPieces = new GamePiece[32];
        int startPositionPawn = 9;     //Arbitrary#
        allPieces[8]=new PawnPiece(int startPositionPawn); //index is arbitrary
        int playerMove = 5;     //Arbitrary#
        allPieces[8].MovePiece(playerMove);
    }
}

最后一行给了我初始位置(在这种情况下为 9),但我知道如果我可以访问 的位置PawnPiece,它会给我 5。对所有编码向导有什么帮助吗?我真的很感激。

4

2 回答 2

2

几个问题:

  1. GamePiece和方法MovePiece应该是抽象的。这样,您将强制选择成为 a 的任何子类GamePiece实现其自己的MovePiece方法。
  2. 您将位置存储在两个地方:

    • int positionGamePiece
    • 你有int positionPawnPawnPiece.

    您可能只想要其中之一:摆脱positionPawninPawnPiece并使用positionin GamePiece

  3. (可选)Java 约定是让方法名称以小写字母开头:重命名MovePiecemovePiece
于 2013-02-15T02:33:20.773 回答
1

从给出的代码中,我可以猜到在 PawnPiece 中您正在更新变量positionPawn,然后检查变量position。所以你写错地方了。

于 2013-02-15T02:32:22.490 回答