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

Does it refer to the same object or not when an object is passed as an argument of the constructor of another class?

提问人:Imal 提问时间:1/18/2022 最后编辑:Imal 更新时间:1/18/2022 访问量:101

问:

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

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 实例和 Class1 在 Class2 上调用 dispose() 的实例不是一样吗?

Java 按引用传递

评论

1赞 GhostCat 1/18/2022
旁注:A)如果你知道你的代码在某种程度上是错误的,你为什么不先修复它,并给我们一个完整的例子?B) 对不起,但是一堵文字墙应该解释你的错误代码是关于什么的......这无济于事。恰恰相反。仅凭你的最后一段,大多数人就会对你的意见投反对票,然后走开。请记住:人类语言总是模棱两可的。避免“解释”事情,展示足够清晰和准确的代码来表达您的请求。
1赞 MC Emperor 1/18/2022
你在任何地方都创建对象。这些对象就像没有标签的盒子。通过使用赋值运算符 (),您可以将对象赋值给引用 - 带有文本的实际标签:您的变量名称。使用 时,可以从分配给它的事物中删除名为“variablename”的标签。但是,该对象不会被破坏。有时,有人来清洁所有没有标签的盒子。他被称为垃圾收集者new=variablename = null
0赞 Mark Rotteveel 1/18/2022
相关: 如何在 Java 中复制对象?

答:

4赞 GhostCat 1/18/2022 #1

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

可以有多个引用指向这两个对象,但设置引用不会“删除”(或释放)堆上的实际对象。null

含义:只要垃圾收集器认为它们“活着”,这些对象就会继续存在。由于给定的示例不完整,因此无法确定不同对象的整体“活动”状态。好吧,该实例不再被引用,因此垃圾回收器有资格收集一个实例。但是我们不知道您是如何创建测试所需的实际实例的。Class2Class1

评论

1赞 Imal 1/18/2022
谢谢你的解释!
1赞 GhostCat 1/18/2022
@Imal 我很欣赏快速接受。