为什么指定的对象有资格进行垃圾回收?
为了记录,我不是 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行之后, C
类型的2个对象有资格进行垃圾回收(GC)?
为什么不是在第4行和第10行中将c1
的副本传递给m1()
方法。 因此,最终在第6行中,将有1个对象(不是2个)将有资格获得GC。 毕竟,不是java传递值而不是传递引用?
是什么让你认为第6行之后有两种类型的C
对象可用于GC? 我只看到一个( c2
)。 你用什么工具来告诉你呢?
关于将c1
传递给你的m1
方法的问题:你通过(通过值)传递的是对象的引用 - 如果你愿意,可以抓取对象的句柄 - 不是它的副本。 事实上,你传递给m1
是完全不相关的,事实上 - 你从不使用那个引用,你立即用一个新对象的引用覆盖它,然后你返回(这不会影响仍然引用的c1
) main
)。
pass-references-by-value和pass-values-by-reference之间有区别:)
Java Pass By引用
Java永远不会通过引用传递正确的权利
按引用传递或按价值传递
你可能想看看Jon Skeet关于C#参数传递语义的文章,因为这是他最喜欢的'程序员无知'pet peeve:
什么是你最喜欢的'程序员无知'宠物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
链接地址: http://www.djcxy.com/p/20667.html
上一篇: Why does the specified object be eligible for garbage collection?