从超类数组中访问子类字段?

时间:2013-02-15 02:23:44

标签: java arrays polymorphism

我刚刚开始学习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.你们所有的编码向导都有帮助吗?我真的很感激。

2 个答案:

答案 0 :(得分:2)

几个问题:

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

    • int position
    • 中有GamePiece
    • int positionPawn中有PawnPiece

    您可能只想要其中一个:摆脱positionPawn中的PawnPiece并使用position中的GamePiece

  3. (可选)Java约定是让方法名称以小写字母开头:将MovePiece重命名为movePiece

答案 1 :(得分:1)

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