我正在使用JButtons创建一个小型国际象棋游戏,作为棋盘的每个单独的牌。然后,我使用以下代码为每个磁贴(总共64个)提供一个动作监听器:
for (int y = 0; y < chessBoardColumns; y++) {
for (int x = 0; x < chessBoardRows; x++) {
JButton square = new JButton();
ActionListener squareListener = new ChessSquareListener(this);
chessBoardSquares[x][y] = square;
chessBoardSquares[x][y].addActionListener(squareListener);
}
}
动作侦听器位于单独的包中,如下所示:
public class ChessSquareListener implements ActionListener {
private ChessGame game;
public ChessSquareListener(ChessGame game) {
this.game = game;
}
public void actionPerformed(ActionEvent e) {
game.doSomething();
}
}
正如您所看到的,我将整个游戏的实例传递给每个方块收听者。这会为每个听众创建64个游戏副本,还是仅仅传递对游戏实例的引用?
答案 0 :(得分:1)
您可能会发现此答案很有用: Is Java "pass-by-reference" or "pass-by-value"?
无论如何,因为类的每个实例实际上都是Java中的指针,所以问题的答案是它只是将引用(指针)传递给游戏实例(如prasad的注释所述) 。因此,Java不会创建副本,这意味着另一方面,如果侦听器将操纵传递的“实例”(this),则操作将影响所有64个侦听器使用的一个实例。
如果您需要更多见解,请告诉我:)。