当一个对象作为另一个类的构造函数的参数传递时,它是否引用了同一个对象



所以我遇到了一些像这样令人困惑的代码。

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实例不是一样的吗?

听起来你不理解堆上对象的概念引用之间的区别"指向";到对象。在您的示例中,创建了两个对象,因为有两个对new whatever()的调用。

您可以有多个引用指向这两个对象,但设置null的引用不会";删除";(或处置(堆上的实际对象。

意思是:对象继续存在,只要垃圾收集器认为它们"活着";。由于给定的例子是不完整的,所以不可能确定整体的";"活着";不同对象的状态。好吧,Class2实例不再被引用,因此有资格被垃圾收集器收集。但我们不知道您是如何创建测试所需的Class1的实际实例的。

最新更新