gpt4 book ai didi

java - 为什么指定的对象有资格进行垃圾回收?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:41 27 4
gpt4 key购买 nike

郑重声明,我不是 Java 初学者,而是 - 一个中级水平的人,有点忘记了 Java 的基础知识。

class C{    public static void main(String a[]){        C c1=new C();        C c2=m1(c1);        //line 4        C c3=new C();        c2=c3;              // line 6        anothermethod();    }    static C m1(C ob1){        ob1 =new C();      // line 10        return ob1;    }    void anothermethod(){}}

从上面的代码:

  • 为什么在第 6 行之后,2 个 C 类型的对象符合垃圾收集 (GC) 的条件?

  • 为什么不在第 4 行和第 10 行中将 c1副本 传递到 m1() 方法。因此,最终在第 6 行中,将有 1 个对象(而不是 2 个)符合 GC 的条件。毕竟,java 不是按值传递而不是按引用传递吗?

最佳答案

按值传递引用和按引用传递值是有区别的:)

Is Java Pass By Reference
Java is never pass by reference right right
Pass By Reference Or Pass By Value

您可能还想查看 Jon Skeet 关于 C# 参数传递语义的文章,因为这是他最喜欢的“程序员无知”的小毛病:
What's your favorite 'programmer ignorance' pet peeve .

基本上,我看到您的代码执行以下操作:

c1 = new C("Alice");
// m1(C obj1) { -- c1 gets passed to m1, a copy of the reference is made.
// -- there are now two references to Alice (c1, obj1)
// obj1 = new C("Bob"); -- there is now one reference to Alice
// and one reference to Bob
// return obj1; -- returns a reference to Bob(c1 still reference Alice)
// } -- when m1 returns, one of the references to Alice disappears.
c2 = m1(c1); // c2 points to Bob
c3 = new C("Charlie");
c2 = c3; // <-- Bob is eligible for collection.
// There are now two references to Charlie

关于java - 为什么指定的对象有资格进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297709/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com