[英]Why does the specified object be eligible for garbage collection?
為了記錄,我不是 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 pass -by-value而不是pass-by-reference?
pass-references-by-value和pass-values-by-reference有區別:)
Java Pass By Reference
Java永遠不會通過引用右轉
通過參考傳遞或通過價值傳遞
你可能想查看Jon Skeet關於C#參數傳遞語義的文章,看看它是他最喜歡的“程序員無知”的寵兒:
什么是你最喜歡的“程序員無知”的寵兒 。
所以基本上,我看到你的代碼執行以下操作:
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
是什么讓你認為在第6行后GC有兩個C
類對象? 我只看到一個( c2
)。 你用什么工具告訴你呢?
關於將c1
傳遞給m1
方法的問題:你傳遞的內容(按值)是對象的引用 - 如果你願意,你可以抓住對象的句柄 - 不是它的副本。 你將引用傳遞給m1
的事實是完全無關緊要的,事實上 - 你從不使用那個引用,你立即用一個新對象的引用覆蓋它,然后你返回(這不會影響仍在引用的c1
) main
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.