2012-05-18 19 views
12

私たちは彼らが静的メソッドで宣言した場合、すべてのローカル変数が静的になるん疑問に思って?例えば静的メソッド内のローカル変数は、静的ていますか?

:私の知る限りでは、Javaは常に値渡しですが、私たちはchangeXの呼び出しを行った後、なぜXの状態が変更されたことを理解し

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がメモリ割り当ての観点から静的変数をどのように扱うのか説明できますか?私たちは(私は人々が正常にことをしないだろう知っている)、パラメータとして関数に静的変数を渡す場合、何が起こることは

+1

staticはローカル変数に意味を持たないので意味がありません。静的メソッドであるかインスタンスメソッドであるかは、ローカル、期間です。 –

+0

ローカル変数または一時変数です。機能が終了すると、スコープはありません。 – Subs

+0

配列はJavaのオブジェクトです。配列の参照は、呼び出されるときにchangeXに渡されるため、配列内の要素はchangeX内で変更できます。 –

答えて

18

は、あなたの質問のほとんどに対する答えは、「他の変数と同じ」です。静的メソッドで

ローカル変数は、静的メソッドではローカル変数だけです。彼らは静的ではなく、彼らは決して特別ではありません。

スタティック変数は、対応するClassオブジェクトに接続されたメモリに保持されます。静的参照変数によって参照されるオブジェクトは、通常のヒープにのみ存在します。あなたが引数としてメソッドに静的変数を渡すとき

...興味深い絶対に何も起こりません。あなたのコード内のシナリオについて

  1. あなたは、文字列の上におもちゃの風船を持っていることを想像してみては(バルーンは、あなたの配列オブジェクトで、文字列は、それへの参照がA()で宣言されています。)
  2. もう1つの文字列をバルーンに合わせて、その文字列を友人に渡します(これは、changeX()メソッドを呼び出すと正確に起こります。文字列はメソッドのパラメータであり、同じオブジェクトを指しています)。 )
  3. 次に、あなたの友人は文字列を引っ張り、黒いマーカを取り、バルーン上に顔を描きます(これは、changeX()メソッドのように、配列を変更します)。
  4. その後、あなたの友人がちょうどあなたのバルーンに接続文字列を残して彼の文字列、unties
  5. 最後に、あなたが文字列でリールとバルーンを見て(メソッドの戻り、changeX()内のローカル変数がスコープの外に出るが。):もちろん、顔が見えます(あなたのA()ルーチンは変更された配列を見ています)。

これは本当に簡単です!

+0

その関数呼び出しの後にXの状態が変わった理由を上記のコードで説明できますか? – peter

+1

@ user1389813:*静的*とは何の関係もなく、すべてが参照変数の理解に関係します。変数については、Javaの牧場が何を言いたいのかをお読みください。 –

+0

しかし、私はJavaが常に値渡しであると思った – peter

2

他の人が指摘しているように、METHODにローカルな変数は他の方法で宣言されている他の変数と同じです - 変数が動的に割り当てられ、可視。

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

1

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

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

関連する問題