私は、Javaメンバー変数と、到達可能リスペクトでのその宣言クラスについて混乱しています。まあ言ってみれば、
- TestPクラスには、TestCタイプのメンバー変数c1があります。
- メインクラスにはTestPpへの参照と、p.c1への別の参照があります。(
makeP()
) - しかし、p1参照が削除された後(
clearP()
)、
p1.c1に到達可能であっても、p1はガベージコレクションされます。
証明することは、c1がいくつかのメソッドをオーバーライドする場合(または単に括弧を開閉する場合でも)、p1はガベージコレクションされないということです。c1がTestP領域を使用しているためだと思いますが、明確な説明をいただければ幸いです。
public class Main {
TestP p;
TestC c;
void makeP { p = new TestP(); c = p.c1; }
void clearP { p = null; }
}
public class TestP {
public TestC c1;
public TestP() {
c1 = new TestC(); // TestP will be garbage-collected.
// c1 = new TestC() {}; // TestP will not be garbage-collected.
}
...
}
public class TestC {
public TestC() {}
}