我在学习Java时正在编写一个简单的棋盘,并提出以下问题:
我有抽象类ChessPiece
和诸如King
,Queen
,Rook
等类,它们都扩展了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