簡體   English   中英

Java 引用范圍外 object

[英]Java referencing an out-a-scope object

我正在保存 Java object 的先前值。 我(幾乎)理解引用是強的、弱的等,但我找不到一個示例來分類我的具體情況,該情況顯然引用了超出范圍的 object。 (我看過很多關於這個主題的帖子。)

aTestCopy將 aTestCopy 引用到范圍外的對象數組aTest有效?

這是一個淺拷貝,但它是否會受到垃圾收集,因此我需要一個深拷貝才能讓它每次都能可靠地工作? 還是應該將新的 object aTest 的聲明與“先前”復制的 object 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
}

使用null作為 Java 中的引用類型的初始值是沒有問題的。 但是將引用類型初始化為null和垃圾回收之間沒有任何關聯。 您應該將aTestCopy初始化為 null 以在另一個 scope 中使用,就像您的情況一樣while

只要 memory 中的 object 不再被任何引用指向,就會觸發垃圾收集。

當您將引用類型分配給另一個引用類型(如果在這種情況下它不是不可變的)時,您復制了該值的 memory 地址。 因此,當您可以在aTestCopy中進行更改時,將反映到參考aTest中。

在 Java 中,變量不保存對象,僅引用對象。

對象的生命周期很大程度上獨立於變量的生命周期:對象是通過執行new創建的,並在程序放棄所有訪問它們的方法后回收(即 object 不再可從程序持有的引用中訪問)。

換句話說,第一個引用 object 的變量沒有特殊意義。 特別是,它不能確定 object 的壽命。 任何引用都會使 object 保持活動狀態,並且不會出現“超出范圍”object 這樣的事情。

同樣,當您分配引用類型的變量時,您只是分配引用,導致兩個變量都指向同一個 object,並通過其他變量看到對此 object 所做的任何更改。

如果你想要一個新的 object,你必須使用new (或者調用一個使用new的方法)。

在您的情況下,我會確保myMethodReturnsATesterArray返回一個new數組,引用new Tester 對象。 然后,由循環的單獨迭代創建的對象將獨立存在,允許循環引用舊對象和新對象並進行它認為合適的任何比較,而不必擔心myMethodReturnsATesterArray的調用以某種方式改變了以前的 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM