我在学习Java时写了一个简单的棋盘,并提出了以下问题:
我有抽象类ChessPiece
以及King
,Queen
,Rook
等类,这些类都扩展为ChessPiece
。
我有一个棋盘的二维ChessPiece数组。
public ChessPiece myChessBoard[][] = new ChessPiece[8][8];
然后我像这样制作棋子:
ChessPiece aPiece = new Rook();
把它放在myChessBoard上,这样我就可以找到它:
myChessBoard[0][0] = aPiece;
其他作品也一样......
我的问题是我何时这样做public ChessPiece myChessBoard[][] = new ChessPiece[8][8];
在我的第一步中,我使用了新关键字并分配了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数组对象”,这要归功于已接受的答案。
答案 0 :(得分:4)
您正在使用这个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
答案 1 :(得分:3)
执行public ChessPiece myChessBoard[][] = new ChessPiece[8][8];
时,您没有创建一个ChessPiece
。您只创建了一个能够引用64个ChessPieces的数组。
所有引用最初都是null
,您必须将它们设置为myChessBoard[1][4] = new Rook()
所以没有必要担心。
我认为你的ChessPiece类是抽象的,所以无论如何Java都不可能创建一个ChessPiece。
但还有一点:Java有自动垃圾收集。因此,即使你有时会创建一些不必要的对象,垃圾收集器也会很快摆脱它。不要过早优化。现在每台计算机都可以处理96或32个对象,并且没有任何明显的区别。
答案 2 :(得分:1)
没有。编写new ChessPiece[8][8]
不会分配64个ChessPiece
个对象。它只创建一个数组,其中包含64个空引用。您需要单独制作ChessPiece
个对象,这就是您正在做的事情。
请注意,许多OOP语言(特别是C ++)在这方面的工作方式不同。
答案 3 :(得分:1)
public ChessPiece myChessBoard[][] = new ChessPiece[8][8]
是一个数组分配语句。它不分配64个新的ChessPiece
个对象,但是包含8 * 8 = 64个ChessPiece
个引用的二维数组,其中大多数是null
。只有在填充每个单独的正方形时,您才真正创建一个新的ChessPiece
对象。
话虽如此,你确实有一点,这个分配政策看起来确实有些浪费。我给你的建议,因为这是一个学习项目 - 将棋盘实现隐藏在它自己的类中(例如,ChessBoard
),现在它将包含你的二维数组。一旦你让其他一切工作满意,你就可以回过头来优化ChessBoard
的内存消耗。
答案 4 :(得分:1)
当您致电ChessPiece myChessBoard[][] = new ChessPiece[8][8];
时,您没有实例化任何ChessPiece
个对象。您只是创建一个可以容纳它们的2D数组。为了给出一个真实的比喻,当你购买塑料容器来容纳剩余的食物时,它们不会随附食物 - 你可以将它们放入容器中。
答案 5 :(得分:1)
创建数组时,您只需将以空值开头的存储单元格分配,但也可以用于以后存储国际象棋棋子,然后创建其中的64个。到目前为止没有棋子。那些仍然需要单独创建。
假设你建造了一个拥有10,000个牢房的监狱。这本身就很棒,但你仍然需要找到10,000名囚犯来填充它。