作者PsMonkey (痞子军团团长)
看板java
标题Re: [问题] 参考变数的传递
时间Tue Feb 5 10:06:37 2013
建议你养成好习惯
method 名称开头都小写
只有 class 名称才开头大写
这样看起来真的比较顺
※ 引述《icetofux ()》之铭言:
: ※ 引述《kaneson (Lance)》之铭言:
: : private void Insert( Node nowNode, int data ) {
: : if ( data < nowNode.data )
: : if ( nowNode.left == null )
: : nowNode.left = new Node( data ) ;
: ^^^^^^^^^^^^^^^^^^
: 离开 Insert( Node, int) 後 nowNode 应该就会消失,这里建立的物件不就会被gc回收
: 掉吗?
: nowNode 在 stack 上,然後藉由 nowNode.left = new Node( data ); 连结到 heap 上
: ,当从 Insert( Node, int) 之中 return 後, nowNode 被从 stack 推出, heap 上
: 的空间就没人指向它了,所以被 gc 回收。
:
: 请问我的观念是哪个地方开始错了呢?
先别管什麽 stack 还是 heap 了,你听过 reference 吗?
我说真的,你不用管什麽 statck 还是 heap(至少我从来都没想过这个)
GC 基本上只在意 instance 有没有被 reference 到
你跳开 method 呼叫的例子来看会比较简单
Foo foo = new Foo();
Object refA = instance;
refA = null;
//在这里,Foo 的 instance 还是被 foo 给 reference 到
//所以那个 instance 不会被 GC 掉
foo = null;
//现在没人指到那个 instance 了,所以有可能被 GC 掉
所以说 callee 的 nowNode 没有被 reference
不代表说 caller 没人 reference 到他
用反面例子就是,除非你这样写,才会是你说的那个剧本
//假设 method 什麽都不做
public static void method(Node n, int v){}
//somewhere
method(new Node(), 1)
不然另一个极端的例子,理论上永远不会被 GC 掉
public class AlwaysNode {
public static node = new Node();
}
//somewhere
method(AlwaysNode.node, 1);
--
钱锺书:
说出来的话
http://www.psmonkey.org
比不上不说出来的话
Java 版 cookcomic 版
只影射着说不出来的话
and more......
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.202.140
1F:推 LaPass:static的话好像要整个class被classloader「丢掉」才会GC的 02/05 10:12
2F:→ LaPass:样子 02/05 10:53
3F:推 bleed1979:可以告诉我node的type是什麽吗? 这算是猴王的尾巴? 02/05 14:53
4F:→ PsMonkey:楼上,我不太懂你的明白..... 02/05 15:16
5F:→ tkcn:在说这句吧: public static node = new Node(); 02/05 21:24
6F:推 bleed1979:楼上是对的。 02/06 23:00