次のコードで、ガベージ コレクターによってオブジェクトの四角形が破棄される可能性はありますか?
...
Point point = new Point(2,4);
Rectangle rectangle = new Rectangle (point, 20, 20);
point = null;
...
長方形は無効化されたポイントを参照するため、ガベージコレクターによってポイントと長方形の両方が破棄されるのは合理的だと思います。
次のコードで、ガベージ コレクターによってオブジェクトの四角形が破棄される可能性はありますか?
...
Point point = new Point(2,4);
Rectangle rectangle = new Rectangle (point, 20, 20);
point = null;
...
長方形は無効化されたポイントを参照するため、ガベージコレクターによってポイントと長方形の両方が破棄されるのは合理的だと思います。
rectangle
長方形を参照し、ポイントオブジェクトを参照しているため、どちらのオブジェクトも収集できません。もはや何も言及していないという事実point
は問題ではありません。
オブジェクトは、ライブ スレッドまたは静的参照から到達できない場合、ガベージ コレクションまたは GC の対象になります。すべての参照が null の場合、オブジェクトはガベージ コレクションの対象になると言えます。また、参照タイプ (強い、弱い、柔らかい、ファントム) についても読んでください。
Rectangleのコンストラクターの機能によって異なります。ポイントオブジェクトへの参照を保存するか、その値をコピーすることができます。
最初のケースでは、どちらのオブジェクトもGCされません。2番目のケースでは、ポイントのみがGCされます。
あなたは言うべき例を十分に与えていませんでした。どちらも、宣言を含む最も近い中かっこのセットであるスコープから外れるとすぐに、GC の対象になります。
長方形の中に Point 型のフィールドがあり、渡したポイントが格納されていると仮定します。
{
Point point = new Point(2,4);
Rectangle rectangle = new Rectangle (point, 20, 20);
point = null;
//No GC yet!
}
//Now they can be GC'd
ポイント参照を null に設定しても、これとはまったく関係ありません。GC は「循環」参照を識別し、他に参照がない場合は両方のオブジェクトを収集します。ポイント変数をnullに設定しても、長方形のコピーを保存した場合、長方形の内側のポイントは無効になり ません! point = null;
そのポインターの値を null に設定しますが、それが指していたオブジェクトは変更されません!