所以我遇到了一些像這樣令人困惑的代碼。
public class Class1 {
private Class2 class2 = new Class2(this);
public void dispose() {
if (class2 != null) {
class2.dispose();
}
if (class2 != null) {
class2.dispose();
class2 = null;
}
}
}
public class Class2 {
private Class1 class1;
private Class3 class3 = new Class3();
public Class2(Class1 class1) {
this.class1 = class1;
}
public void dispose() {
if (class3 != null) {
class3 = null;
}
class1 = null;
}
}
這只是實際課程中對這個問題重要的部分的摘錄。我知道這段代碼的撰寫方式不正確,但就是這樣。
Class1 的實體傳遞給 Class2 的建構式并作為類變數保存,而 Class1 的實體將 Class2 的實體保存為類變數。
當在 Class1 中呼叫 dispose() 方法時,它會呼叫 Class2 中的 dispose 方法,并在 Class2 的 dispose 方法中將 null 分配給它保存在那里的 Class1 變數。
此代碼不會產生錯誤并執行 Class1 的 dispose() 方法中的所有行。
被Class2中的dispose方法無效化的Class1的實體和Class2上呼叫dispose()的Class1的實體不一樣嗎?
uj5u.com熱心網友回復:
聽起來您不了解堆上物件的概念與“指向”物件的參考之間的區別。在您的示例中,創建了兩個物件,因為有兩個呼叫new whatever().
您可以有多個指向這兩個物件的參考,但設定對的參考null不會“洗掉”(或處置)堆上的實際物件。
含義:物件繼續存在,只要垃圾收集器認為它們“活著”。由于給定的示例不完整,因此無法確定不同物件的整體“活動”狀態。好吧,該Class2實體不再被參考,因此有資格被垃圾收集器收集。但是我們不知道您是如何創建Class1測驗所需的實際實體的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414440.html
標籤:
