繁体   English   中英

Java参考和新关键字

[英]Java reference and new keyword

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

我有抽象类ChessPiece和类,如KingQueenRook等,它们都扩展了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();时再次这样做了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

public ChessPiece myChessBoard[][] = new ChessPiece[8][8]; 你没有创建一个ChessPiece 您只创建了一个能够引用64个ChessPieces的Array。

所有引用最初都将为null ,您必须将它们设置为myChessBoard[1][4] = new Rook()

所以没必要担心。

我认为你的ChessPiece类无论如何都是抽象的,所以Java无论如何都不可能创建一个ChessPiece。

但还有一点:Java有自动垃圾收集。 因此,即使你有时会创建一些不必要的对象,垃圾收集器也会很快摆脱它。 不要过早优化。 现在每台计算机都可以处理96或32个对象,并且没有任何明显的区别。

编写new ChessPiece[8][8]不会分配64个ChessPiece对象。 它只创建一个数组,其中包含64个空引用。 你需要单独制作ChessPiece对象,这就是你正在做的事情。

请注意,许多OOP语言(特别是C ++)在这方面的工作方式不同。

public ChessPiece myChessBoard[][] = new ChessPiece[8][8]是一个数组分配语句。 没有分配64个新的ChessPiece对象,而是一个二维数组,其中包含8 * 8 = 64个对ChessPiece的引用,其中大部分都是null 只有填充每个单独的正方形才能实际创建一个新的ChessPiece对象。

话虽如此,你确实有一点,这个分配政策看起来确实有些浪费。 我给你的建议,因为这是一个学习项目 - 在自己的类中隐藏棋盘实现(例如, ChessBoard ),现在它将包含你的二维数组。 一旦你让其他一切工作满意,你就可以回过头来优化ChessBoard的内存消耗。

当你打电话给ChessPiece myChessBoard[][] = new ChessPiece[8][8]; ,你没有实例化任何ChessPiece对象。 您只是创建一个可以容纳它们的2D数组。 为了给出一个真实的类比,当你购买塑料容器来存放剩余的食物时,它们不会随附食物 - 你可以将它放入容器中。

在创建数组时,您只需将以空值开头的存储单元分配,但也可以用于以后存储国际象棋,然后创建其中的64个。 到目前为止没有棋子。 那些仍然需要单独创建。

假设你建造了一个拥有10,000个牢房的监狱。 这本身就很棒,但你仍然需要找到10,000名囚犯来填充它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM