[英]what happens when i initialize again in method even though previously initialized a instance variable with same name
[英]What happens when initializing multiple objects in a for loop with the same variable name?
在此循环中,有一个名为pawn
变量,但是循环使用该变量创建了8个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);
}
}
当你说
squares[1][i].setPiece(pawn1);
您可以使用new
保存创建的引用。 每次调用new
都会创建一个名为pawn1
的临时引用,然后将其与前面提到的setPiece
调用一起setPiece
。 只要squares
有引用,就没有资格进行垃圾回收。
简短了解发生的情况,如下所示:
new Pawn(1, i, 1, "white");
JVM在堆上分配一个新的对象。
Pawn pawn1 = new Pawn(1, i, 1, "white");
对新分配的对象的引用将分配给pawn1
。 将引用视为一个值,该值表示“在堆中的此位置查找对象”。
squares[1][i].setPiece(pawn1);
setPiece
是通过引用Object来调用的。
循环终止, pawn1
“消失”。 这仅意味着pawn1
本身不再可用。 对象本身存储在堆中,因此不会消失。 整个过程重复一遍,直到循环完成。
销毁对象的过程称为垃圾回收,它不会影响任何仍在使用的对象(例如在pawn1
中存储了引用的对象)。
这些典当如何区分?
感谢参考。 每个对象都存储在堆上的不同位置。 所有要做的就是比较位置以注意到差异(来自JVM内部POV)。
这怎么可能?
这是可能的,因为在for循环的每次迭代中都会创建一个pawn
实例。 pawn1
只是创建object
的标识符。 在for循环迭代中创建的每个对象都是存储在堆内存中的独立对象。
Pawn pawn1 = new Pawn(1, i, 1, "white");
我们是否能够区分从该变量创建的每个典当?
我们可以通过其基础数据(而不是pawn1
标识符)来区分它们。 例如,如果每个pawn
对象都重写了toString()
方法,而您将其打印出来,则会注意到它们是不同的对象,除非两个不同的对象具有相同的基础数据,那么它们将具有相同的string
表示形式。
变量只是指向对象的指针(或者为null
,它什么也不指向)。 如果您有一个物理棋盘,并用手指指向每个棋子,则可以使用相同的指针指向16个不同的对象。 在Java中是相同的。
您可以稍后通过维护单独的指针来检索每个对象。 您的代码通过将pawn1
指针的值复制到每个squares
元素中来做到这一点。
循环结束时, pawn1
指针(变量)超出范围并消失,但是squares
引用仍保留在范围内。
但是,如果您从squares
替换值,而没有将引用(指针)复制到先前对象的某个地方,则您将永远失去对该先前对象的最后一个引用,并且它将变得不可访问。
对象不是“从[a]变量创建的”。 它们是通过调用new
(通常)而创建的,并且返回指向结果对象的指针,大概是为了赋值给变量或参与某些操作。 您也可以丢弃结果参考,但这可能是一个错误。
您可以创建一个对象并将其引用分配给用于保存不同值的同一变量,就像可以为任何非最终变量,原始或引用分配不同的值一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.