当一个对象作为另一个class的构造函数的参数传递时,它是否引用同一个对象?
Does it refer to the same object or not when an object is passed as an argument of the constructor of another class?
所以我遇到了一些像这样令人困惑的代码。
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;
}
}
这只是从实际 classes 中摘录对这个问题重要的内容。我知道这段代码的写法不正确,但它是这样的。
Class1 的实例传递给 Class2 的构造函数并保存为 class 变量,而 Class1 的实例将 Class2 的实例保存为 class 变量。
在Class1中调用dispose()方法时,会调用Class2中的dispose方法,在Class2的dispose方法中,将null赋值给一直保存在Class1中的变量
此代码不会产生错误并执行 Class1 的 dispose() 方法中的所有行。
Class1的实例被Class2的dispose方法作废,和Class1的实例调用Class2的dispose()不一样吗?
听起来你不明白堆上的对象和引用“指向”对象的概念之间的区别.在您的示例中,创建了 两个 个对象,因为有两次调用 new whatever()
.
您可以指向这两个对象的多个引用,但是设置对null
的引用不“删除”(或处置)堆上的实际对象。
意思是:只要垃圾收集器认为它们“还活着”,对象就会继续存在。由于给出的示例不完整,因此无法确定不同对象的整体“活动”状态。好吧,Class2
实例不再被引用,因此有资格被垃圾收集器收集。但是我们不知道您如何创建您的测试需要的 Class1
的实际实例。
所以我遇到了一些像这样令人困惑的代码。
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;
}
}
这只是从实际 classes 中摘录对这个问题重要的内容。我知道这段代码的写法不正确,但它是这样的。
Class1 的实例传递给 Class2 的构造函数并保存为 class 变量,而 Class1 的实例将 Class2 的实例保存为 class 变量。
在Class1中调用dispose()方法时,会调用Class2中的dispose方法,在Class2的dispose方法中,将null赋值给一直保存在Class1中的变量
此代码不会产生错误并执行 Class1 的 dispose() 方法中的所有行。
Class1的实例被Class2的dispose方法作废,和Class1的实例调用Class2的dispose()不一样吗?
听起来你不明白堆上的对象和引用“指向”对象的概念之间的区别.在您的示例中,创建了 两个 个对象,因为有两次调用 new whatever()
.
您可以指向这两个对象的多个引用,但是设置对null
的引用不“删除”(或处置)堆上的实际对象。
意思是:只要垃圾收集器认为它们“还活着”,对象就会继续存在。由于给出的示例不完整,因此无法确定不同对象的整体“活动”状态。好吧,Class2
实例不再被引用,因此有资格被垃圾收集器收集。但是我们不知道您如何创建您的测试需要的 Class1
的实际实例。