Javaにはキーワードがないことに気づきましfree
た。そのため、理由を尋ねられます。新しいオブジェクトまたは配列を作成するとき、その変数のスコープは何ですか?
私はC++とCに精通しています。
Javaにはキーワードがないことに気づきましfree
た。そのため、理由を尋ねられます。新しいオブジェクトまたは配列を作成するとき、その変数のスコープは何ですか?
私はC++とCに精通しています。
オブジェクトの存続期間は、Javaのローカル変数のスコープとはほとんど関係ありません。例えば
File f = new File("a");
f = new File("b");
// variable f is still in scope but the first object can be cleaned up.
また
private final List<File> files = ...
{
File f = new File("a");
files.add(f);
} // f is out of scope but the object lives on in "files".
スコープは、新しい変数(または)オブジェクトを作成した場所によって異なります。
インスタンス変数/オブジェクトとして作成した場合、そのスコープはそのインスタンス用です。
クラス変数/オブジェクト(静的)として作成した場合、そのスコープはクラスローダーです。
ローカル変数/オブジェクト(静的)として作成した場合、そのスコープはそのメソッド用です。
オブジェクトに到達できない場合は、GCの対象になります(スコープに関係なく)。
変数には標準のスコープがあります:メソッドまたはブロック(インスタンス変数でない限り)。変数(つまり、プリミティブまたは参照)はスタックに保持されますが、オブジェクトと配列(プリミティブの配列でさえ)は常にヒープに保持されます。
オブジェクト(配列もオブジェクトです)はもちろん、可変スコープから渡してそこに残すことができます。オブジェクトは到達可能である限り存続します(参照グラフを介してオブジェクトに到達する方法があります)。スコープとは何の関係もありません。
一方、変数は常にスコープ内に存在します。それをどこにでも渡して変更する方法はありません。参照は常にメソッドに渡され、コピーとして返されます。