2017-02-19 6 views
0

だから私の質問はwhileループ内に同じ名前の敵変数

がなぜ次のコードは、変数名文句ないです...「wordView」が複数回初期化されている。..

int index = 0; 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(index)); 
    rootview.addView(wordView); 

    index++; 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(index)); 
    rootview.addView(wordView); 

    index++; 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(index)); 
    rootview.addView(wordView); 

が、このコードはありませんか?

int index = 0; 
while(index<words.size()){ 
    TextView wordView = new TextView(this); 
    wordView.setText(words.get(index)); 
    rootview.addView(wordView); 
    index++; 
} 

これは正しいことですか?

+0

「変数スコープ」を参照してください。 2番目のケースでは、ループの各繰り返しの最後にwordViewが有効範囲外になります。ループが進むと、同じ名前の新しい変数がスコープに戻ってきます。前の例では、wordViewを再び初期化しようとする前に、スコープから外れることはありません。 – Jameson

答えて

1

理由は簡単です。

最初のコードスニペットでは、はすべて同じブロックで3つの変数が定義されているため、同じスコープが許可されていません。ブロックまたはスコープでは、変数は一度しか定義できません。

しかし、2番目のコードスニペットでは、は、そのループブロックまたはスコープに変数を1回だけ定義しています。ループの1回の反復の後、変数の有効範囲が終了し、変数の有効期間が終了します。新しい反復が始まると、全く新しい変数が初期化されます。

これはすべて変数の範囲に関するものです。ループは、ブロック内のコードが何回もコピーされることを意味するとは考えてはいけません。 ループが繰り返されるたびに、ブロック内の変数のスコープが終了し、が終了し、新しいスコープが開始されます。

+0

この回答で問題は解決していますか?それからupvotingとそれを受け入れることを検討してください。 –

0

変数wordViewのスコープは、ここで注意する必要があります。最初のコードスニペットで

  1. 、変数wordViewはあなたにエラーを与える同じブロックで再宣言されている:

    以下は何が起こっているかです。ブロック内で同じ名前の変数を持つことはできません。

  2. 2番目のコードスニペットでは、ループ内に変数があります。これは、変数wordViewが各繰り返しの最後に「新しい意味」を得ることを意味します。
関連する問題