0

我正在保存 Java 对象的先前值。我(几乎)理解引用是强引用、弱引用等,但我找不到一个示例来分类我的具体情况,显然是引用超出范围的对象。(我看过很多关于这个主题的帖子。)

Java 对aTestCopy超出范围的对象数组的引用是否aTest有效?

这是一个浅拷贝,但它是否会受到垃圾收集,因此我需要一个深拷贝才能让它每次都能可靠地工作?还是应该将新对象的声明aTest放在while“先前”复制的对象之外aTestCopy

null对首次通过开关使用一个好的做法还是应该是一个单独的boolean变量?谢谢。

Tester[] aTestCopy = null;
while(true)
{
    Tester[] aTest = myMethodReturnsATesterArray(); // new values

    // need code to skip using aTestCopy the first time through - no previous value
    // else use the previous value here

    aTestCopy = aTest; // save them for the next use of previous values
}
4

2 回答 2

1

null在 Java 中用作引用类型的初始值是没有问题的。null但是将引用类型初始化为和垃圾回收之间没有任何关联。您应该初始化aTestCopy为 null 以在另一个范围内使用,例如在while.

只要内存中的对象不再被任何引用指向,就会触发垃圾收集。

当您将引用类型分配给另一个引用类型时(如果在这种情况下它不是不可变的),您复制了该值的内存地址。所以当你可以做出改变时aTestCopy会反映到参考aTest上。

于 2022-01-18T17:34:46.667 回答
0

在 Java 中,变量不保存对象,只保存对对象的引用。

对象的生命周期很大程度上独立于变量的生命周期:对象是通过执行创建的new,并在程序放弃所有访问它们的方式后回收(即,对象不再从程序持有的引用中访问)。

换句话说,第一个保存对象引用的变量没有特殊意义。特别是,它不会确定该对象的生命周期。任何引用都会使对象保持活动状态,并且不会有“超出范围”对象之类的东西。

同样,当您分配引用类型的变量时,您只是分配引用,导致两个变量都指向同一个对象,并通过另一个变量看到对该对象所做的任何更改。

如果你想要一个新对象,你必须使用new(或调用使用的方法new)。

在你的情况下,我会确保myMethodReturnsATesterArray返回一个new数组,引用newTester 对象。然后,由循环的单独迭代创建的对象将独立存在,允许循环引用旧对象和新对象并进行它认为合适的比较,而不必担心调用myMethodReturnsATesterArray会以某种方式更改先前的对象。

于 2022-01-18T17:56:36.113 回答