13

ローカル変数を静的メソッドで宣言すると、すべてのローカル変数が静的になるのでしょうか?

例えば:

  public static void A(){
        int x [] = {3,2};
        changeX(x);

        for (int i = 0; i< x.length; i++){
             System.out.println(x[i]);   // this will print -1 and 1
        }
  }
  private static void changeX(int[] x){
        x[0] = -1;
        x[1] =  1;
  }

私が理解している限り、Java は常に値渡しですが、changeX 呼び出しを行った後に X の状態が変わったのはなぜですか? 誰でもそれを説明できますか?Javaがメモリ割り当てに関して静的変数をどのように処理するかを誰かが説明できますか? 静的変数をパラメーターとして関数に渡すとどうなりますか (通常、人々はそうしないことを知っています)。

4

3 に答える 3

24

ほとんどの質問に対する答えは、「他の変数と同じ」です。

静的メソッドのローカル変数は、静的メソッドの単なるローカル変数です。それらは静的ではなく、決して特別なものではありません。

静的変数Classは、対応するオブジェクトに関連付けられたメモリに保持されます。静的参照変数によって参照されるオブジェクトはすべて、通常のヒープに存在します。

静的変数を引数としてメソッドに渡すと...まったく興味深いことは何も起こりません。

あなたのコードのシナリオについて:

  1. 文字列におもちゃの風船があると想像してください (風船は配列オブジェクトで、文字列は で宣言された参照A()です)。
  2. 次に、別の文字列をバルーンに結び付けて、その文字列を友人に渡します (メソッドを呼び出すと、まさにそのようになりますchangeX()。文字列はメソッドのパラメーターであり、同じオブジェクトを指します)。
  3. 次に、友人は紐を引っ張り、黒いマーカーを取り、風船に顔を描きます (これはchangeX()配列を変更するメソッドのようなものです)。
  4. 次に、友人は自分の文字列をほどいて、バルーンに付いている文字列だけを残します (メソッドが戻り、ローカル変数 inchangeX()がスコープ外になります)。
  5. 最後に、文字列を巻き取り、バルーンを確認します。もちろん、顔が見えます (A()ルーチンでは、変更された配列が表示されます)。

それは本当にそれと同じくらい簡単です!

于 2012-05-18T02:18:22.800 に答える
3

他の人が指摘しているように、METHODに対してローカルな変数は、他のメソッド内で宣言された他の変数と同じです。動的に割り当てられ、メソッドが変数を返すときに解放される可能性があります。

ただし、静的変数が必要な場合は、クラスの通常の静的変数として、メソッドの外部で宣言する必要があります。慣例により、特定のメソッド内にある場合を除いて、それらをそのままにしておくと、静的でメソッドに対してローカルである場合と同じ効果があります。その効果にコメントを追加してください。

于 2012-05-18T02:22:30.440 に答える
1

静的変数は、「永続世代」と呼ばれるヒープの特別な領域に格納されます。

静的メソッドで宣言されたローカル変数は、非静的メソッドで宣言されたものと何の違いもありません。オブジェクト参照とプリミティブ変数はスタックに配置されます。オブジェクトを作成するたびに、そのコードが実行されるときにストレージがヒープに割り当てられます。

于 2012-05-18T02:28:13.717 に答える