在此循环中有一个名为pawn
的变量,但循环使用该变量创建8 Pawn
(s)。这怎么可能?而且,我们能够区分从这一个变量创建的每个pawn吗?
public void setUpChessPieces() {
for (int i = 0; i < ChessGame.EIGHT; i++) {
//param 1:row, param 2:col, param 3:player#, param4:chess piece color
Pawn pawn1 = new Pawn(1, i, 1, "white");
//squares has a setPiece method
squares[1][i].setPiece(pawn1);
}
}
答案 0 :(得分:2)
当你说
时squares[1][i].setPiece(pawn1);
您保存使用new
创建的引用。每次拨打new
时,都会创建一个名为pawn1
的临时参考,但之后会通过前面提到的setPiece
来保存它。只要squares
有引用,就不会符合垃圾回收条件。
答案 1 :(得分:2)
对所发生的事情的简短描述将如下所示:
new Pawn(1, i, 1, "white");
JVM在堆上分配一个新的对象。
Pawn pawn1 = new Pawn(1, i, 1, "white");
对新分配的对象的引用被分配给pawn1
。将引用视为一个值,即“在堆中的这个地方寻找对象”。
squares[1][i].setPiece(pawn1);
使用对象的引用调用 setPiece
。
循环终止,pawn1
“消失”。这仅仅意味着pawn1
本身不再可访问。 Object本身存储在堆上,因此不会消失。这个过程一直重复,直到循环完成。
对象被销毁的过程称为垃圾收集,不会影响任何仍在使用的对象(如pawn1
中存储引用的对象。)
如何区分这些棋子? 感谢参考。每个Object都存储在堆上的不同位置。所有人必须做的是比较位置以注意差异(来自JVM内部POV)。
答案 2 :(得分:2)
这怎么可能?
这是可能的,因为在for循环的每次迭代中都会创建一个pawn
实例。 pawn1
只是创建的object
的标识符。在for循环迭代中创建的每个对象都是存储在堆内存中的独立对象。
Pawn pawn1 = new Pawn(1, i, 1, "white");
我们是否能够区分每个棋子 是从这一个变量创建的吗?
我们可以通过基础数据区分它们,而不是pawn1
标识符。例如,如果每个pawn
对象都覆盖了toString()
方法并且你要打印出来,你会发现它们是不同的对象,除非两个不同的对象具有相同的基础数据然后它们会有相同的string
表示。
答案 3 :(得分:0)
变量只是指向对象的指针(或null
,指向任何东西)。如果你有一个物理国际象棋棋盘并用手指指向每个棋子,你可以用相同的指针指向16个不同的对象。在Java中也是如此。
您可以稍后通过维护单独的指针来检索每个对象。您的代码通过将pawn1
指针的值复制到每个squares
元素中来实现此目的。
当循环结束时,pawn1
指针(变量)超出范围并消失,但squares
引用仍在范围内。
但是,如果从squares
替换值而不将某个引用(指针)复制到前一个对象,则将永远丢失对该先前对象的最后一个引用,并且它将无法访问。
对象不是“从[a]变量创建的”。它们是从new
(通常)的调用创建的,并返回指向结果对象的指针,可能是为了赋值给变量或参与某些操作。您也可以丢弃结果引用,但这可能是错误。
您可以创建一个对象并将其引用分配给用于保存不同值的同一个变量,就像您可以为任何非最终变量,原始值或引用分配不同的值一样。