我在学习Java时正在编写一个简单的棋盘,并提出以下问题:

我有抽象类ChessPiece和诸如KingQueenRook等类,它们都扩展了ChessPiece

而且我有2D的ChessPiece棋盘阵列。

public ChessPiece myChessBoard[][] = new ChessPiece[8][8];

然后我像这样制作棋子:
ChessPiece aPiece = new Rook();

并将其放在myChessBoard上,这样我就可以找到它:
myChessBoard[0][0] = aPiece;

其他作品也一样...

我的问题是何时执行此public ChessPiece myChessBoard[][] = new ChessPiece[8][8];在第一步中,我使用了new关键字并分配了8 * 8 = 64个ChessPiece对象,对吗?但是我在编写ChessPiece aPiece = new Rook();时又做了一遍,我觉得myChessBoard中的东西,例如myChessBoard [0] [0]不需要分配,因为它只是一个参考,不需要像new Rook()这样的真正象棋棋子那么多的空间。

简而言之,我觉得我只需要分配32个带有新关键字的棋子(棋盘上的32个棋子),而不是32 + 64 = 96棋子。

我可能对Java的一些基本概念感到困惑,请帮忙。

编辑:
myChessBoard[][] = new ChessPiece[8][8]在这里,我使用new关键字创建没有实际对象的64参考。所以new关键字不一定创建新对象,它还可以创建引用null的新引用,对吗?

那是错的。感谢接受的答案,“在这种情况下,新关键字正在创建一个新的2D数组对象”。

最佳答案

您使用public ChessPiece myChessBoard[][] = new ChessPiece[8][8];所做的全部工作就是初始化一个新的游戏板。游戏板上有64个正方形(每个正方形由2D索引值表示),而不是64个棋子。因此,每个方格都可以像myChessBoard[0][0] = new Rook();这样的棋子值

// or to give your pieces references
Knight blackKnight1 = new Knight();
myChessBoard[0][1] = blackKnight1;

Bishop blackBishop1 = new Bishop();
myChessBoard[0][2] = blackBishop1;

Queen blackQueen = new Queen();
myChessBoard[0][3] = blackQueen;

// and do the rest with all the other pieces according
// to their position in the 2d array

10-02 08:02