繁体   English   中英

在for循环中使用相同的变量名初始化多个对象时会发生什么?

[英]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.

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