1

Javaにはキーワードがないことに気づきましfreeた。そのため、理由を尋ねられます。新しいオブジェクトまたは配列を作成するとき、その変数のスコープは何ですか?

私はC++とCに精通しています。

4

4 に答える 4

4

オブジェクトの存続期間は、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".
于 2012-08-23T14:04:08.157 に答える
3
  1. 変数はJavaでオブジェクトを保持せず、プリミティブ値またはオブジェクト参照を保持します(重要な違い:変数がスコープ外になるからといって、オブジェクトをガベージコレクションできるわけではなく、他の方法で到達できる可能性があります)参照 )
  2. 変数のスコープはC/C++と非常によく似ています
    • ブロックまたはメソッド(ローカル変数の場合)
    • オブジェクト(非静的フィールドの場合)または
    • クラス(静的フィールド用)
  3. オブジェクトは、到達できなくなったときに(すぐにではなく、最終的に)ガベージコレクションされます。
于 2012-08-23T14:04:01.177 に答える
0

スコープは、新しい変数(または)オブジェクトを作成した場所によって異なります。

インスタンス変数/オブジェクトとして作成した場合、そのスコープはそのインスタンス用です。

クラス変数/オブジェクト(静的)として作成した場合、そのスコープはクラスローダーです。

ローカル変数/オブジェクト(静的)として作成した場合、そのスコープはそのメソッド用です。

オブジェクトに到達できない場合は、GCの対象になります(スコープに関係なく)。

于 2012-08-23T14:02:57.097 に答える
0

変数には標準のスコープがあります:メソッドまたはブロック(インスタンス変数でない限り)。変数(つまり、プリミティブまたは参照)はスタックに保持されますが、オブジェクトと配列(プリミティブの配列でさえ)は常にヒープに保持されます。

オブジェクト(配列もオブジェクトです)はもちろん、可変スコープから渡してそこに残すことができます。オブジェクトは到達可能である限り存続します(参照グラフを介してオブジェクトに到達する方法があります)。スコープとは何の関係もありません。

一方、変数は常にスコープ内に存在します。それをどこにでも渡して変更する方法はありません。参照は常にメソッドに渡され、コピーとして返されます。

于 2012-08-23T14:04:16.160 に答える